这篇文章将为大家详细讲解有关c++如何使用仿函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。所谓仿函数就是和函数调用非常类似的一种调用方式,实际上仿函数只是重载了()运算符,这种方式在STL容器函数中使
这篇文章将为大家详细讲解有关c++如何使用仿函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
所谓仿函数就是和函数调用非常类似的一种调用方式,实际上仿函数只是重载了()运算符,
这种方式在STL容器函数中使用非常普遍,其中又分为函数对象和谓词
class t
{
public:
void operator()(stu& a) 函数对象(一元)
};
void test(stu& a) 函数
那么调用我们可以很清楚的可以看出
仿函数调用为
t lfun;
lfun(a);
其中lfun为定义的类对象而已
函数调用为
test(a);
他们的调用看起来及其相似。
下面演示仿函数的使用方式
点击(此处)折叠或打开
#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函数的区别,因为仿函数更加方便
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;
}
关于“C++如何使用仿函数”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
--结束END--
本文标题: C++如何使用仿函数
本文链接: https://www.lsjlt.com/news/238096.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0