functor 仿函数

仿函数(functor)的概念

  仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。仿函数新名称是函数对象function objects,一种具有函数特质的对象,

要将某种操作当作算法的参数,唯一办法是先将该操作设计为一个函数,再将函数指针当作算法的一个参数,或者将该操作设计为一个仿函数(在语言层面是个class)再以该仿函数产生一个对象,并以此对象作为算法的一个参数。在我们写代码时有时会发现有些功能的实现的代码,会不断的在不同的成员函数中用到,但是又不好将这些代码独立出来成为一个类的一个成员函数。但是又很想复用这些代码。写一个公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。这时就可以用仿函数了,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量的全局化的维护了。又可以使那些代码独立出来,以便下次复用。而且这些仿函数,还可以用关联,聚合,依赖的类之间的关系,与用到他们的类组合在一起,这样有利于资源的管理(这点可能是它相对于函数最显著的优点了)另外函数指针有时候也可以实现相同功能,但是函数指针不能满足STL对抽象性的要求,并且函数指针无法与STL其他组件如配接器搭配产生灵活变化。仿函数就是一个“行为类似函数”的对象。仿函数应该有能力被函数配接器修饰。

函数类型主要用来表现函数参数类型和返回值类型。STL仿函数,分一元二元仿函数,以功能划分, 分为算术运算,关系运算,逻辑运算。仿函数的功能主要是搭配STL算法。 

代码示例:

//继承的binary_function用来呈现二元函数的两个参数类型,及返回类型

//如果是一元函数,则需要继承unary_function

#include<iostream>

using namespace std;

template<typename T>

struct add:publicbinary_function<T,T,T>  {

         Toperator()(const T& x,const T& y)const {eturn x+y;}

};

int main()

{

         add<int>obj;

         cout<<obj(4,5)<<endl;

         cout<<add<int>()(3,4)<<endl;

         return0;

}

注意到仿函数add本身是一个类,只是完成了函数的功能,所以叫作函数对象,他可以产生一个对象来当作普通函数使用,或者产生一个无名的临时对象来履行函数功能

STL仿函数与算法关系:

Algorithm(iv.begin(),iv.end(),greater<int>()) 

其中的greater<int>()就是定义的仿函数(本来这应该放函数指针)














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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值