C++ (1) 函数对象与谓词

来源:互联网 发布:java 迭代器 for循环 编辑:程序博客网 时间:2024/06/06 08:54

在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);
           }

      };

转自:http://blog.csdn.net/dove1984/article/details/7911577

0 0
原创粉丝点击