一、概观
1、在STL历史上有两个不同的名称,仿函数是早期的命名,C++标准规格定案后采用的新名称是函数对象。
2、要将某种操作当作算法的参数,唯一办法是先将该操作设计为一个函数,再将函数指针当作算法的一个参数,或是将该操作设计
为一个所谓的仿函数(就语言层面而言是个class),再以该仿函数产生一个对象,并以此对象作为算法的一个参数。
3、既然函数指针可以达到“将整组操作当作算法的参数”,又何必需要所谓的仿函数呢?
因为函数指针毕竟不能满足STL对抽象性的要求,也不能满足软件积木的要求,函数指针无法和STL其他组件搭配。
4、仿函数为了能够“行为类似函数”,其类别定义中必须自定义function call运算子 operator()。
5、仿函数若以操作数的个数来分,可分为一元和二元仿函数,若以功能来分,可分为算术运算、关系运算、逻辑运算三类。
二、可配接的关键
1、每个仿函数都必须定义自己的相应型别。
2、仿函数的相应型别主要用来表现函数参数型别和传回值型别。
3、unary_function用来呈现一元函数的参数型别和传回值型别,定义如下:
template <class Arg, class Result> struct unary_function { typedef Arg argument_type; typedef Result result_type; };
4、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; };
三、STL中内置的一些仿函数
包含算术类、关系类、逻辑类等。
四、C++可重载的运算符
1、几乎所有的运算符都可用作重载。具体包含:
算术运算符:+,-,*,/,%,++,--;
位操作运算符:&,|,~,^,<<,>>
逻辑运算符:!,&&,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
2、下列运算符不允许重载:
.,.*,::,?:
五、总结
仿函数在STL中是最小的一块,但作用非常大。要好好去理解。