函数对象(仿函数)是一个类,不是一个函数
特点:
特点1举例:
class MyAdd { public: int operator()(int v1, int v2) { return v1 + v2; } }; void test() { MyAdd myAdd; cout << myAdd(10, 10) << endl; }
特点2举例:
class MyPrint { public: MyPrint() { this->count = 0; } void operator()(string test) { cout << test << endl; this->count++; } int count; //内部自己状态 }; void test() { MyPrint myPrint; myPrint("hello world"); }
特点3举例:
void doPrint(MyPrint &mp, string test) { mp(test); } void test() { MyPrint myPrint; doPrint(myPrint, "hello c++"); }
class GreaterFive { public: bool operator()(int val) { return val > 5; } }; void test() { vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive()); if (it = v.end()) { cout << "未找到" << endl; } else { cout << "找到了大于5的数字为:" << *it << endl; } }
class MyCompare { public: bool operator()(int val1, int val2) { return val1 > val2; } }; void test() { vector<int> v; v.push_back(10); v.push_back(40); v.push_back(20); sort(v.begin(), v.end()); for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; //使用函数对象,改变算法策略,变为排序规则为从大到小 sort(v.begin(), v.end(), MyCompare()); cout << "--------------------------" << endl; for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; }
STL内建了一些函数对象
#include<functional>
negate
是一元运算,其他都是二元运算template<class T> T plus<T>
//加法仿函数template<class T> T mimus<T>
//减法仿函数template<class T> T multiplies<T>
//乘法仿函数template<class T> T divides<T>
//除法函数template<class T> T modulus <T>
//取模仿函数template<class T> T negate<T>
//取反仿函数template<class T> bool equal_to<T>
//等于template<class T> bool not_equal_to<T>
//不等于template<class T> bool greater<T>
//大于template<class T> bool greater_equal<T>
//大于等于template<class T> bool less<T>
//小于template<class T> bool less_equal<T>
//小于等于template<class T> bool logical_and<T>
//逻辑与template<class T> bool logical_or<T>
//逻辑或template<class T> bool logical_not<T>
//逻辑非