C++仿函数

简介: 所谓仿函数就是和函数调用非常类似的一种调用方式,实际上仿函数只是重载了()运算符, 这种方式在STL容器函数中使用非常普遍,其中又分为函数对象和谓词 class t { public: void operator()(stu& a) 函数对象(一元) ...

所谓仿函数就是和函数调用非常类似的一种调用方式,实际上仿函数只是重载了()运算符,
这种方式在STL容器函数中使用非常普遍,其中又分为函数对象和谓词

class t
{
public:
void operator()(stu& a) 函数对象(一元)
/*
bool operator()(stu& a) 谓词(一元),谓词只会放回布尔值
*/
};
void test(stu& a) 函数

那么调用我们可以很清楚的可以看出
仿函数调用为
t lfun;
lfun(a); 
其中lfun为定义的类对象而已
函数调用为
test(a);

他们的调用看起来及其相似。

下面演示仿函数的使用方式

点击(此处)折叠或打开

  1. /*************************************************************************
  2.     > File Name: 仿函数.cpp
  3.     > Author: gaopeng QQ:22389860 all right reserved
  4.     > Mail: gaopp_200217@163.com
  5.     > Created Time: Sun 23 Apr 2017 08:03:41 PM CST
  6.  ************************************************************************/

  7. #include<iostream>
  8. #include<vector>
  9. #include<algorithm>
  10. #include<string.h>
  11. using namespace std;




  12. class testfun //仿函数
  13. {
  14.         public:
  15.                 testfun(void)
  16.                 {
  17.                         cnt = 0;
  18.                 }
  19.                 void operator()(int& a)
  20.                         {
  21.                                 cnt++;
  22.                                 if( !(a%67))
  23.                                 {
  24.                                         cout<<a <<endl;
  25.                                 }
  26.                         }
  27.                 int cnt;
  28. };


  29. class stu
  30. {
  31.         private:
  32.                 char name[20];
  33.                 int age;
  34.                 friend class stufun;
  35.         public:
  36.                 stu(const char* inc,int b)
  37.                 {
  38.                         strcpy(name,inc);
  39.                         age = b;
  40.                 }

  41. };

  42. class stufun
  43. {
  44.         public:
  45.                 int equ;
  46.         public:
  47.                 stufun(int m):equ(m){} //构造函数,仿函数中可以存储任何比较条件 这是仿函数(函数对象或者谓词)和函数指针进行传递到STL函数的区别,因为仿函数更加方便
  48.                 /*
  49.                 void operator()(stu& a) //仿函数 一元函数对象 stufun(m)比较比m大的值 stu&a代表是STL函数会将每一个容器对象 stu 通过引用传入到a中然后一一进行比较
  50.                 {
  51.                         if(a.age == equ)
  52.                         {
  53.                                 cout<<a.name<<endl;
  54.                                 cout<<a.age<<endl;
  55.                         }
  56.                 }
  57.                 */
  58.                 bool operator()(stu& a) //一元谓词 stu&a代表是STL函数会将每一个容器对象 stu 通过引用传入到a中然后一一进行比较
  59.                 {
  60.                         if(a.age == equ)
  61.                         {
  62.                                 cout<<a.name<<endl;
  63.                                 cout<<a.age<<endl;
  64.                                 return true;
  65.                         }
  66.                         else
  67.                         {
  68.                                 return false;
  69.                         }
  70.                 }

  71. };


  72. void kkfun(int& a)
  73. {
  74.         if( !(a%67))
  75.         {
  76.                 cout<<a <<endl;
  77.         }
  78. }

  79. int main(void)
  80. {
  81.         cout<<"test1----"<<endl;
  82.         vector<int> m;
  83.         for(int i = 0;i<999;i++)
  84.         {
  85.                 m.push_back(i);
  86.         }
  87.         testfun l;
  88.     l = for_each(m.begin(),m.end(),testfun());//调用仿函数 匿名函数对象 进行拷贝需要接回来

  89.         for_each(m.begin(),m.end(),kkfun);//调用函数指针
  90.         cout<<"test2----"<<endl;

  91.         vector<stu> ii;
  92.         stu a("gaopeng",31);
  93.         stu b("yanllei",30);
  94.         stu c("gzh",3);
  95.         stu d("test",31);
  96.         ii.push_back(a);
  97.         ii.push_back(b);
  98.         ii.push_back(c);
  99.         ii.push_back(d);

  100.         //for_each(ii.begin(),ii.end(),stufun());
  101.         stufun o(3);
  102.         for_each(ii.begin(),ii.end(),o);//调用谓词 定义的函数对象o

  103. // stufun o;
  104. // o(a);


  105.         return 0;

  106. }



相关文章
|
7月前
|
C++ 容器
【C++】仿函数在模板中的应用——【默认模板实参】详解(n)
【C++】仿函数在模板中的应用——【默认模板实参】详解(n)
|
3月前
|
C++
C++(十七)仿函数
### Functor 仿函数简介 Functor(仿函数)是一种通过在类中实现 `operator()` 使其行为像函数的对象。这种方式可以让类拥有更多可定制的功能,同时保持函数般的简洁调用方式。下面展示了如何定义和使用一个计算幂运算的仿函数类,并通过示例说明了其在 `std::sort` 中的优势与灵活性。
|
5月前
|
存储 算法 Java
【C++】优先级队列priority_queue模拟实现&&仿函数
【C++】优先级队列priority_queue模拟实现&&仿函数
42 1
|
6月前
|
算法 安全 编译器
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
60 1
|
7月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(上)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
54 1
|
7月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
30 0
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
|
6月前
|
C++
C++函数对象(仿函数)
C++函数对象(仿函数)
|
算法 测试技术 C++
C++:优先级队列模拟实现和仿函数的概念使用
C++:优先级队列模拟实现和仿函数的概念使用
|
7月前
|
编译器 C语言 C++
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
|
存储 算法 安全
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】