现在的位置: 首页 > 综合 > 正文

【STL】仿函数细节

2018年04月23日 ⁄ 综合 ⁄ 共 1054字 ⁄ 字号 评论关闭

一、概观

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中是最小的一块,但作用非常大。要好好去理解。

抱歉!评论已关闭.