函数对象 谓词

转自http://blog.sina.com.cn/s/blog_6a8b07370100kuvg.html


在C++中,在应用程序运行阶段存在的所有实体都是对象,因此struct和class也可用作函数,这称为函数对象。注意,函数也可通过函数指针来调用,他们也是函数对象。
    从概念上说,函数对象是用作函数的对象;但从实现上说,函数对象是实现了operator()的类的对象。虽然函数和函数指针也可以归为函数对象,但实现了operator()的类的对象才能保存状态(即类的成员属性的值),才能用于STL算法。
    接受一个参数的函数,叫做一元函数,如果一元函数返回布尔值,则该函数成为一元谓词;接受两个参数的函数为二元函数,如果返回一个布尔值,则该函数称为二元谓词。
 
 1.一元函数

     一元函数在实现STL算法for_each时使用的比较多。
     通常定义一个struct
     template <typename T>
     struct DisplayElement
     {
           void operator() (const T& element)const
          {
                cout<<element<<' ';
          }
     };
     同时,在for_each中的调用格式为:
     for_each(someVector.begin(),someVector.end(),DisplayElement<type>() );
     其中someVector为事先定义的某种容器,type为一种数据类型。这样联合起来就可以实现打印someVector中元素的功能。

 

 2.一元谓词

     返回布尔值的一元函数是谓词。这种函数可供STL算法进行判断。常用于find_if、remove_if以满足相应的情况来查找或者删除。
     例如:
     template <typename T>
     struct IsMultiple
     {
          bool operator() (const T& element) const
          {
                return ((element%2)==0)
          }
     };
     上例实现对偶数的筛选。

 

3.二元函数

     如果函数 f(x,y)根据输入参数返回一个值,它将很有用。这种二元函数可用于对两个操作数执行运算,如加、减、乘、除等,如下面的二元函数返回输入参数的乘积:
     template <typename T>
     class CMultiply
     {
     public:
           T operator() (const T& elem1,const T& elem2)
           {
                return (elem1*elem2);
           }
      };

 

 4.二元谓词 
     接受两个参数并返回一个布尔值的函数是二元谓词。这种函数用于诸如std::sort等STL函数中,如下使用二元谓词对存储std::string 值的容器进行不区分大小写的排序。二元谓词::在判断两个对象时经常使用到。
     class CCompareStringNoCase
     {
     public:
           bool operator() (const string & str1,const string& str2) const
          {
              string str1LowerCase;
              str1LowerCase.resize(str1.size());
              transform(str1.begin(),str1.end(),str1LowerCase.begin(),::tolower);

              string str2LowerCase;
              str2LowerCase.resize(str2.size());
              transform(str2.begin(),str2.end(),str1LowerCase.begin(),::tolower);
              return (str1LowerCase<str2LowerCase);
           }
      };

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值