函数对象
今天思来想去,去了健身房锻炼了半个小时,然后吃了一碗米线。后来,想想今天是不是应该看看书呢,于是乎,来到公司看了看函数对象这块知识。
概念:
所谓函数对象其实是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能就是获取一个值,或者改变操作的状态。在C++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用。
分类:
常用的函数对象可以分为产生器(generator),一元函数(unary function),二元函数(binary function),一元谓词(unary predicate),二元谓词(binary prediciate)
下面给出两个例子:
1.第一个例子用普通的函数作为函数对象
//定义一个普通函数
int mult(int x, int y){return x*y;}; int array[] = {1, 2, 3, 4, 5}; const int N = sizeof(array)/sizeof(int); cout << "the result:"<<accumulate(array, array+N,1,mult)<<endl;
2.重载了函数调用符的类作为函数对象
class MultClass { public: int operator()(int x, int y)const{return x*y;}//重载操作符operator() }; int array[] = {1, 2, 3, 4, 5}; const int N = sizeof(array)/sizeof(int); cout << "MultClass accumulate result is"<<accumulate(array, array + N, 1, MultClass());
说一下函数适配器:
STL中定义了大量的函数对象,但是有时候需要函数返回值需要进一步简单计算,或者填上多余的参数,不能直接带入算法。函数适配器实现了这一功能,将一种函数对象转化为另一种符合要求的函数对象。
函数适配器可以分为4大类:
1.绑定适配器
2.组合适配器
3.指针函数适配器
4.成员函数适配器
给一个关于绑定适配器的例子:
//STL函数适配器,在数组中查找第一个大于40的元素
/////////////////////////////////////////////////////////
int intArr[] = {30, 90, 10, 40, 70, 50, 20, 80}; const int NArr = sizeof(intArr)/sizeof(int); vector<int> arr(intArr, intArr + NArr); vector<int>::iterator p = find_if(arr.begin(), arr.end(), bind2nd(greater<int>(), 40)); if (p == arr.end()) { cout<<"no element greater than 40"<<endl; } else { cout<<"first element greater than 40 is:" << *p<<endl; }
//////////////////////////////////////////////////////////
今天就说这么多,后续会继续研究这块滴~

浙公网安备 33010602011771号