所谓仿函数就是和函数调用非常类似的一种调用方式,实际上仿函数只是重载了()运算符,
这种方式在STL容器函数中使用非常普遍,其中又分为函数对象和谓词
class t
{
public:
void operator()(stu& a) 函数对象(一元)
/*
bool operator()(stu& a) 谓词(一元),谓词只会放回布尔值
*/
};
void test(stu& a) 函数
那么调用我们可以很清楚的可以看出
仿函数调用为
t lfun;
lfun(a);
其中lfun为定义的类对象而已
函数调用为
test(a);
他们的调用看起来及其相似。
下面演示仿函数的使用方式
点击(此处)折叠或打开
- /*************************************************************************
- > File Name: 仿函数.cpp
- > Author: gaopeng QQ:22389860 all right reserved
- > Mail: gaopp_200217@163.com
- > Created Time: Sun 23 Apr 2017 08:03:41 PM CST
- ************************************************************************/
-
- #include<iostream>
- #include<vector>
- #include<algorithm>
- #include<string.h>
- using namespace std;
-
-
-
-
- class testfun //仿函数
- {
- public:
- testfun(void)
- {
- cnt = 0;
- }
- void operator()(int& a)
- {
- cnt++;
- if( !(a%67))
- {
- cout<<a <<endl;
- }
- }
- int cnt;
- };
-
-
- class stu
- {
- private:
- char name[20];
- int age;
- friend class stufun;
- public:
- stu(const char* inc,int b)
- {
- strcpy(name,inc);
- age = b;
- }
-
- };
-
- class stufun
- {
- public:
- int equ;
- public:
- stufun(int m):equ(m){} //构造函数,仿函数中可以存储任何比较条件 这是仿函数(函数对象或者谓词)和函数指针进行传递到STL函数的区别,因为仿函数更加方便
- /*
- void operator()(stu& a) //仿函数 一元函数对象 stufun(m)比较比m大的值 stu&a代表是STL函数会将每一个容器对象 stu 通过引用传入到a中然后一一进行比较
- {
- if(a.age == equ)
- {
- cout<<a.name<<endl;
- cout<<a.age<<endl;
- }
- }
- */
- bool operator()(stu& a) //一元谓词 stu&a代表是STL函数会将每一个容器对象 stu 通过引用传入到a中然后一一进行比较
- {
- if(a.age == equ)
- {
- cout<<a.name<<endl;
- cout<<a.age<<endl;
- return true;
- }
- else
- {
- return false;
- }
- }
-
- };
-
-
- void kkfun(int& a)
- {
- if( !(a%67))
- {
- cout<<a <<endl;
- }
- }
-
- int main(void)
- {
- cout<<"test1----"<<endl;
- vector<int> m;
- for(int i = 0;i<999;i++)
- {
- m.push_back(i);
- }
- testfun l;
- l = for_each(m.begin(),m.end(),testfun());//调用仿函数 匿名函数对象 进行拷贝需要接回来
-
- for_each(m.begin(),m.end(),kkfun);//调用函数指针
- cout<<"test2----"<<endl;
-
- vector<stu> ii;
- stu a("gaopeng",31);
- stu b("yanllei",30);
- stu c("gzh",3);
- stu d("test",31);
- ii.push_back(a);
- ii.push_back(b);
- ii.push_back(c);
- ii.push_back(d);
-
- //for_each(ii.begin(),ii.end(),stufun());
- stufun o(3);
- for_each(ii.begin(),ii.end(),o);//调用谓词 定义的函数对象o
-
- // stufun o;
- // o(a);
-
-
- return 0;
-
- }