BÀI 10:THƯ VIỆN FUNCTIONAL Có nhiều sự mập mờ do từ đồng nghĩa giữa các khái niệm toán học trong cả hai ngôn ngữ tiếng Việt và tiếng Anh, do đó định nghĩa sau chỉ ở mức cố gắng chính xác nhất có thể được: Số toán tử (operand) của một phép toán (operator), tương ứng là số đối số (argument) của một hàm (function), được gọi là hạng (arity) của phép toán hay hàm đó Tương tự, số toán tử (operand) của một biểu thức (expression), tương ứng là số đối số (argument) của một đối tượng hàm (functor), được...
LẬP TRÌNH C/C++ NÂNG CAO Yêu cầu trước đọc: học xong Lập trình C/C++ BÀI 10:THƯ VIỆN FUNCTIONAL CODE #include Hạng predicate Có nhiều mập mờ từ đồng nghĩa khái niệm tốn học hai ngơn ngữ tiếng Việt tiếng Anh, định nghĩa sau mức cố gắng xác được: Số toán tử (operand) phép toán (operator), tương ứng số đối số (argument) hàm (function), gọi hạng (arity) phép tốn hay hàm Tương tự, số toán tử (operand) biểu thức (expression), tương ứng số đối số (argument) đối tượng hàm (functor), gọi hạng (arity) biểu thức hay đối tượng hàm Ví dụ Unary (đơn ngun, đơn phân, tốn hạng, ngơi) n! (giai thừa n) unary operator n! unary expression, bao gồm unary operator int giaithua(int n) unary function object class giaithua{int operator()(int n)…} unary functor Binary (nhị nguyên, nhị phân, hai tốn hạng, hai ngơi) a + b binary expression, bao gồm binary operator int addition(int a,int b) binary function object class addition{int operator()(int a,int b)…} binary functor Ternary (tam ngun, tam phân, ba tốn hạng, ba ngơi) b * b – * a * c ternary expression, bao gồm unary operator ba binary operator double delta(double a, double b,double c) ternary function object class delta{ double operator()(double a, double b,double c)…} ternary functor n-ary (đa nguyên, đa phân, nhiều tốn hạng, nhiều ngơi) Tương tự trên, ngồi cịn có nhiều từ gốc Latin khác quaternary (bốn toán hạng) quinary (năm toán hạng) … gọi chung nhiều toán hạng Hạng predicate tức hạng function hay functor mà đóng vai trị predicate Như ví dụ trên, addition binary predicate, delta ternary predicate Cấu trúc unary_function thư viện functional Trong thư viện functional định nghĩa sẵn cấu trúc unary_function CODE template struct unary_function { typedef Arg argument_type; typedef Result result_type; }; unary_function cấu trúc định nghĩa sẵn cho tất unary function unary functor với Arg kiểu liệu đối số Result kiểu trả hàm có operator() Chúng ta viết lại lớp IsOdd, định nghĩa unary_function CODE class IsOdd:public unary_function { public: bool operator()(int n) const { return n%2; } }; Cấu trúc binary_function thư viện functional Tương tự, thư viện functional định nghĩa sẵn cấu trúc binary_function CODE template struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; binary_function cấu trúc định nghĩa sẵn cho tất binary function binary functor với Arg1 kiểu liệu đối số thứ Arg2 kiểu liệu đối số thứ hai Result kiểu trả hàm có operator() Chúng ta viết lại lớp compare, định nghĩa binary_function CODE class compare:public binary_function { public: bool operator()(int i,int j) const { return i==j; } }; Tương tự tự viết cấu trúc ternary_function, quaternary_function, vân vân muốn Ví dụ cấu trúc ternary_function tự viết lớp định nghĩa ternary_function CODE template struct ternary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Arg3 third_argument_type; typedef Result result_type; }; class multiply:public ternary_function { public: double operator()(int i,float f,long l) const { return i*f*l; } }; Ràng buộc (bind) tốn hạng cho predicate Có nhiều hàm chấp nhận đối số, lại cần chuyền vào cho predicate binary predicate binary function hay binary functor Trong trường hợp cần ràng buộc tốn hạng cho binary predicate để trở thành unary predicate Ví dụ cần dùng hàm find_if để tìm phần tử vector thỏa binary predicate, find_if lại chấp nhận unary predicate, cần ràng buộc tốn hạng cho binary predicate để trở thành unary predicate binary predicate muốn ràng buộc toán hạng phải định nghĩa binary_function Hàm bind1st Hàm bind1st ràng buộc toán hạng thứ binary predicate với giá trị cho trước để trở thành unary predicate với đối số lại binary predicate ban đầu trở thành đối số unary predicate kết CODE class compare:public binary_function { public: bool operator()(int i,int j) const { return i+1==j; } }; int main() { vector v; v.push_back(4);v.push_back(0);v.push_back(1); vector::iterator i=find_if(v.begin(),v.end(),bind1st(compare(),0)); if(i!=v.end()) cout