仿函数

xiaoxiao2021-02-28  9

仿函数:

仿函数又名函数对象:

    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、若以功能划分,可分为算术运算、关系运算、逻辑运算。

转载请注明原文地址: https://www.6miu.com/read-1900388.html

最新回复(0)