C++仿函数(函数对象)

仿函数(函数对象)<根据以前学习笔记整理>
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(),在类实例化时,将要用到的元素传入类中。仿函数可以使代码独立出来,下次复用。这些仿函数还可以用关联、聚合、依赖的类之间的关系,与用到他们的类组合在一起。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值