仿函数(函数对象)<根据以前学习笔记整理>
1 基本概念:重载函数调用操作符的类,其对象称为函数对象;函数对象使用重载的()时,行为类似函数调用,故称为仿函数。仿函数本质仍是类,不是真正的函数。举例说明其常见情形:
a. 函数对象(仿函数),可以像普通函数被调用,可以有返回值,可以有参数。
举例:
class myAdd {
public:
int operator () ( int v1, int v2 ) {
return v1+v2; }
};
使用时,先实例化:
myAdd s;
cout<< s ( 3,5 )<<endl; //输出结果 8,使用过程和函数类似
b. 函数对象超出普通函数的概念,可以有自己的状态 。
举例:
class myPrint {
public:
int count;
myPrint() { //在构造函数中将计数变量赋初值0
this->count=0;}
void operator () ( string str ) {
cout<<str<<endl;
count++; } //仿函数没被调用一次计数变量+1
};
其中的count可以记载仿函数被调用的次数,作为成员属性外边可以访问。
c. 函数对象可以作为参数传递
举例:(将b中myPrint对象作为参数传递给函数doPrint调用)
void doPrint ( myPrint &mp,string str ) {
mp(str); }
//当执行下面两行语句时:
myPrint my1;
doPrint ( mp1, "123456789" );
//输出结果,屏幕显示出 123456789
2 谓词:返回值为bool类型的仿函数叫谓词,一个参数的叫一元谓词,相应的有二元谓词等。
一元谓词举例:
class GreaterFive {
public:
bool operator () ( int val ) {
return val>5; }
};
一元谓词用法:
设有一个int型vector对象v,v中有n个数,要查找首个大于5的数字,可如下操作:
vector<int>::iterator it;
it=find_if(v.begin(),v.end(),GreaterFive( ) ); //参数是的迭代器和仿函数
上面 GreaterFive ( ) 是匿名对象,匿名使用仿函数最为方便,代码简洁,当然也可以实例化一个类名做参数;注意find_if()函数需要包含algoritnm头文件,参数中头两个是迭代器,第三个谓词仿函数,返回值也是迭代器;找到返回所在位置迭代器,找不到返回end()。
一元谓词举例二:(将v中数据按需要规则排序)
class MyCompare {
public:
bool operator () (int num1, int num2) {
return num1>num2; } //“>“ 降序; “<“升序
};
用法1:
MyCompare m;
sort(v.begin(),v.end(), m );
用法2:
sort(v.begin(),v.end(),MyCompare()); // 匿名对象
3 内建函数对象:(C++ STL中内置的一些函数对象)
使用前:#include<fuctional>
算术类:
取反 negate,使用举例:
negate <int> negate_int;
cout<<negate_int(50)<<endl; //输出结果:-50
加法 plus,使用举例:
plus <float> plus_float;
cout<<plus_float(26.45,25.14)<<endl; //输出结果:51.59
减法minus、乘法multiplies、除法divides、取余modulus等使用方法类似。
关系类:
等于equal_to、不等于not_equal_to、大于greater、大于等于greater_equal、小于less、小于等于less_equal
以大于greater举例:sort(vec_int.begin(),vec_int.end(),greater<int>( ) );
逻辑类:逻辑与logical_and、逻辑或logical_or、逻辑非logical_not
logical_not举例:(说明 :使用transform需要包含<algorithm>头文件,之前要做resize() )
vector<bool> vec_bool;
vector<bool> vec_bool_02;
vec_bool_02. resize(vec_bool. size());
transform(vec_bool.begin(),vec_bool.end(),vec_bool_02.begin(), logical_not<bool>() );
4 仿函数小结:写一个简单类,除了那些维护一个类的成员函数外,就只实现一个operator(),在类实例化时,将要用到的元素传入类中。仿函数可以使代码独立出来,下次复用。这些仿函数还可以用关联、聚合、依赖的类之间的关系,与用到他们的类组合在一起。
12-22
1112
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交