STL 源码剖析:7、仿函数


历经前数章的 memory pool、iterator-traits、type_traits、deque、RB-tree、hash table、QuickSort、IntroSort … 的复杂洗礼与无情轰炸,你的脑袋快吃不消了吧。这一张是轻松小菜,让我们在此稍事停顿,修生养息。



7.1 仿函数概观


就实现观点而言,仿函数其实上就是一个 “行为类似函数” 的对象。为了能够 “行为类似对象”,其类别定义中必须自定义 function call 运算子。

按照操作符个数分类:一元仿函数、二元仿函数。

按照功能分类:算术运算、关系运算、逻辑运算。



7.2 可配接的关键


为了拥有配接能力,每一个仿函数必须定义自己的相应型别。这些相应型别是为了让配接器能够取出,获得仿函数的某些信息。相应型别都只是一些 typedef,所有必要操作在编译器就全部完成了。

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

7.2.1 unary_function

用来呈现一元函数的参数型别和回返值型别。

7.2.2 binary_function

用来呈现二元函数的第一参数型别、第二参数型别,以及回返之型别。



7.3 算术类仿函数


STL 内建的 “算术类仿函数”,支持加法、减法、乘法、除法、模数和否定,六种运算。



7.4 关系运算类仿函数


STL 内建的 “关系运算符仿函数”,支持等于、不等于、大于、大于等于、小于、小于等于,六种运算。



7.5 逻辑运算类仿函数


STL 内建的 “逻辑运算类仿函数” ,支持 And、Or、Not,三种运算。



7.6 证同、选择、投射


都只是原封不动地传回数据,之所以这样做,是为了间接性 —— 间接性是抽象化的重要工具。



猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/102884593
今日推荐