作者:我是谁的宝贝儿呢颓 | 来源:互联网 | 2023-01-30 17:30
1.概述:仿函数,就是函数对象,使用时候调用该对象的成员函数operate()..对象可以有自己的数据域(内部状态).eg:仿函数示例*author:wzy1222;email:627
1. 概述:仿函数,就是函数对象,使用时候调用该对象的成员函数operate () ..对象可以有自己的数据域(内部状态).
eg: 仿函数示例
/*
author: wzy1222 ;
email: 627440781@qq.com
*/
#include
#include
#include
using namespace std;
// 仿函数
class WzyFun{
private:
int val;
public:
WzyFun():val(0){}
WzyFun(int value):val(value){}
int operator() ()
{
val+=2;
return val;
}
};
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9};
vector ivec(arr,arr+9);
// generate 发生
generate(ivec.begin(),ivec.end(),WzyFun(100));
for(vector::iterator iter=ivec.begin();iter!=ivec.end();++iter)
cout<<*iter<
system("PAUSE");
return 0;
}
2. 仿函数是传值而不是传址,所以算法不会改变仿函数的状态.
WzyFun wzy(200);
generate(ivec.begin(),ivec.end(),wzy);
generate(ivec.begin(),ivec.end(),wzy);
显示出来是一样的效果,wzy仍然没有改变.想要改变仿函数的状态有两种方法
1> 参数显式声明为引用形 generate::iterator, vector::iterator, WzyFun& >(ivec.begin(),ivec.end(),wzy);
2> 使用for_each() 这个算法可以返回 仿函数的值. WzyFun wzyback=for_each(ivec.begin(),ivec.end(),wzy);
注意: 不应该传递一个"行为取决于调用次数"的仿函数. 如果必须要调用,应该在operator() 前加上const.
如: 调用remove_if()算法的时候, 它还会调用find_if.. 如果传递的是仿函数没有加const,则会被两次调用,且传的均是初始值,而初始了调用次数~~ P303
3. 预定义的仿函数 (头文件 )
4. 函数配接器 (将仿函数和另一个仿函数(值,或普通函数均可)结合起来的仿函数, 也要包含头文件 )
not1(bind2nd(modulus(),2)) -----------> !( t%2)