C++仿函数

仿函数是早期的命名,C++标准规格定案后所采用的新名称是 函数对象(function  objects)。

“函数对象”比较贴切:一种具有函数特质的对象。而“仿函数”指其可以被调用者可以像函数一样地被调用,在被调用者则以对象所定义的 function call operator 扮演函数的实质角色。

仿函数主要应用于STL中,相当于你指定的某种“操作”,当做一种参数进行传递。函数指针可以达到“将整组操作当做算法的参数”,那何必有所谓的仿函数呢?原因在于函数指针毕竟不能满足STL对抽象性的要求,也不能满足软件积木的要求-----函数指针无法和STL其它组件(如配接器)搭配,产生更灵活的变化。

就实现观点而言,仿函数其实就是一个“行为类似函数”的对象。为了能够“行为类似函数”,其类别定义中必须自定义 function call 运算子(operator())。拥有这样的运算子后,我们就可以在仿函数的对象后面加上一对小括号,以此调用仿函数所定义的 operator(),像这样:

#include<functional>
#include<iostream>
using namespace std;
int mian()
{
   greater<int> ig;
   cout<<boolalpha<<ig(4,6);          // (A) false
   cout<<greater<int>()(6,4);          // (B) true
}

greater<int> ig 的意思是产生一个名为 ig 的对象,ig(4,6) 则是调用其 operator(),并给予两个参数4,6。第二种用法中的 greater<int>() 意思是产生一个临时对象,之后的(4,6)才是指定两个参数4,6。

STL仿函数分类,若以操作数的个数划分,可分为一元和二元仿函数,若以功能划分,可分为算术运算、关系运算、逻辑运算三大类。

STL 仿函数应该有能力被函数配接器修饰。为了有配接能力,每一个仿函数必须定义自己的相应型别,就像迭代器如果要融入整个STL 大家庭,也必须依照规定定义自己的5个相应型别一样。这些相应型别是为了让配接器能够取出,获得仿函数的某些信息。相应型别都只是一些 typedef ,所有必要操作再编译期就全部完成了,对程序的执行效率没有任何影响,不带来任何负担。

仿函数的相应相别主要用来表现函数参数型别和传回值型别。为了方便起见,<stl_function.h>定义了两个classes,分别代表一元仿函数和二元仿函数,其中没有任何 data  members 或 member  functions,唯有一些型别定义。任何仿函数只要依个人需求选择继承其中一个  class,便自动拥有了那些相应型别,也就自动拥有了配接能力。

unary_function

unary_function 用来呈现一元函数的参数型别和返回值型别。其定义如下:

template<class  Arg,class  Result>
struct  unary_function {
        typedef   Arg   argument_type;
        typedef   Result   result_type;
};

一旦仿函数继承了 unary_function,其用户便可以这样取得仿函数的参数型别,并以相同手法取得其返回值型别:

// 以下仿函数继承了 unary_function.

template<class  T>
struct  negate : public  unary_function<T,T> {
     T operator()(const  T&  x)const {  return  -x;  }
};

binary_function

binary_function 用来呈现二元函数的第一参数型别、第二参数型别、以及返回值型别。其定义如下:

template<class  Arg1,class  Arg2,class  Result>
     struct  binary_function {
     typedef   Arg1    first_argument_type;
     typedef   Arg2    second_argument_type;
     typedef   Result   result_type;
};

一旦仿函数继承了 binary_function,其用户便可以这样取得仿函数的参数型别,并以相同手法取得其返回值型别:

// 以下仿函数继承了 binary_function.

template<class  T>
struct  plus : public  binary_function<T,T,T> {
     T  operator() (const  T& x, const  T& y) const {  return  x+y;  }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值