仿函数:
仿函数又名函数对象:
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、若以功能划分,可分为算术运算、关系运算、逻辑运算。