函数对象与谓词

在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);
       }
  };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值