仿函数
一.仿函数概论
仿函数,现在又叫函数对象,从字面意思来说,就是模仿的函数或者有函数功能的对象。
为什么需要仿函数呢,从前面各种算法也可以看出来时常需要自行传递函数,按理来说其实函数指针也够用了,但是函数指针不够抽象,也不能和配接器搭配,所以使用仿函数。
仿函数的实现是创建一个类,类中有重载()的函数,使用的时候是先创建一个对象,然后用这个对象就可以作为函数使用了(或者用()创建一个临时对象当作函数也行)。
STL的仿函数可以按操作数分的话可分为一元、二元仿函数,若按功能分的话可分为算法运算,关系运算,逻辑运算,STL中也有自己内建的一些仿函数,要使用必须包含头文件,接下来主要就是介绍这些内建的仿函数。
二.可配接(adaptable)的关键
仿函数应该有能力被函数配接器配接,为了拥有这种能力,仿函数内应该像迭代器一样有一些型别,这些型别可以被配接器取出,定义型别也比较简单,直接用typedef就行。同时,STL中还有两个class,分别代表一元仿函数和二元仿函数,里面什么都没有,只有类别,所以我们的仿函数可以按需继承其中一个class,便自动拥有了其中的类别。接下来介绍这两个class。
unary_function
用于呈现一元仿函数的参数型别和返回值型别。每个一元仿函数继承这个类别,然后配接器就可以取出相应的型别。
binary_function
用于呈现二元仿函数的参数型别和返回值型别。每个二元仿函数继承这个类别,然后配接器可以利用这个修改接口。
三.算术类仿函数
STL中内建的算术类仿函数支持加法,减法,乘法,除法,模数,否定。
同时STL中还定义两个证同元素的函数,所谓证同元素,是指与该元素运算会得到本身,明显,加法的证同元素是0,乘法的证同元素是1,STL中定义了返回这两个证同元素的函数(虽然不是规范)。
四.关系运算类仿函数
STL中内建的关系类仿函数支持等于,不等于,大于,大于等于,小于,小于等于,定义和用法比较简单。
五.逻辑运算类仿函数
STL中内建的逻辑运算类仿函数支持And,Or,Not三种运算。
六.证同(identity),选择(select),投射(project)
这一节介绍的仿函数只是有选择的将参数原封不动的传回去,这样是为了提高抽象性,得到相应的型别。
identit(证同)
将传入的参数原本传回去,使用于set中,因为set实值即键值。
select1st(选择第一元素)
接收一个pair,返回其第一元素(的型别),使用于map中,因为map第一元素为键值。
select2nd(选择第二元素)
如题。
project1st(传回第一参数)
主要这个和选择的区别,选择是接收一个参数,返回参数的某个元素,而这个是接收两个参数,返回某个参数。
project2nd(传回第二参数)
如题。