仿函数

仿函数:

仿函数又名函数对象:

    1、调用者:可以像函数一样被调用;

    2、被调用者:以对象所定义的function call operator扮演函数的实质角色

仿函数的主要作用:

以tempplate参数指定你要采取的策略。以sort()为例,其第一个版本是以operator < 为排序时的元素位置调整依据,第二个版本则允许用户指定任何“操作”,务求排序后的两两相邻元素都能操作结果为true。

要将某种“操作”当做算法的参数

    1、一个办法就是先将该“操作”设计为一个函数,再将函数指针当做算法的一个参数;

    2、将该“操作”设计为一个所谓的仿函数(就语言层面而言是个class),再以该仿函数产生一个对象,并以此对象作为算法的一个参数。

既然函数指针可以达到“将整组操作当做算法的参数”,那又何必有所谓的仿函数呢?原因在于函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求---函数指针无法和STL其他组件(如配接器)搭配,产生更灵活的变化。

仿函数其实就是“行为类似函数”的对象,为了能够“行为类似函数”,其类别定义中必须自定义(或说改写、重载)function call 运算子(operator())。拥有这样的运算子后我们就可以在仿函数的后面加上一对小括号,以此调用仿函数所定义的operator()。

比如:

#include<functional>  
#include<iostream>  
using namespace std;  
  
int main()  
{  
    //greater<int> ig;  
    cout<<greater<int>()(6,4);  
    cout<<endl;  
    return 1;  
}  

STL仿函数应该有能力被函数配接器修饰,为了拥有配接能力,每一个仿函数必须定义自己的相应型别,就像迭代器如果要融入整个STL大家庭,也必须依照规定定义自己的5个型别一样。这写相应型别是为了让配接器能够取出,获得仿函数的某些信息。

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

STL仿函数的分类

1、若以操作数的个数来划分,可分为一元和二元仿函数;

2、若以功能划分,可分为算术运算、关系运算、逻辑运算。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值