# 函数对象 函数对象也叫函数符。函数符是可以用函数的方式让对象与括号结合使用。包括了函数名、指向函数的指针和重载了类对象的`operator()()` 的类。 ```C++ class Linear { private: double slope; double y0; public: Linear(double sl_=1, double y_=0): slope(sl_), y0(y_) {} double operator()(double x) { return slope*x+y0; } }; ``` ## 函数符概念 STL定义了函数符概念: - 生成器(generator)是不用参数就可以调用的函数符。 - 一元函数(unary function)是用一个参数可以调用的函数符。 - 二元函数(binary function)是用两个参数可以调用的函数符。 例如,提供for_each()的函数是一元函数,因为它每次用于一个容器的元素。list模板有一个将谓词作为参数的remove_if()成员函数,该函数将谓词作用与区间的每个元素,如果谓词返回true,则删除这个元素。 ```C++ bool too_big(int n) {return n>100;} list socres; scores.remove_if(too_big); //删除scores中大于100的元素。 ``` ## 预定义的函数符 STL定义了多个基本的函数符,它们执行诸如将两个值相加、比较两个值是否相等的操作。 通常使用的transform()函数。它有两个版本。第一的版本接受4个参数,前两个参数是指定容器区间的迭代器,第三个参数是指定将结果复制到哪里的迭代器,最后一个参数是一个函数符,它被应用于区间中每个元素,生成结果中的新元素值。第二个版本使用一个接受两个参数的函数,并将该函数用于两个区间的函数。使用另一个参数标识第二个区间的起始位置。如`transform(gr8.begin(), gr.end(), m8.begin(), out, mean)` 。 预定义的函数符在头文件中。 | 运算符 | 相应的函数符 | | ------ | ------------------------ | | + | plus | | - | minus | | * | multiplies(旧C++times) | | / | divides | | % | modulus | | - | negate | | == | equal_to | | != | not_equal_to | | > | greater | | < | less | | >= | greater_equal | | <= | less_equal | | && | logical_and | | \|\| | logical_or | | ! | logical_not |