函数对象概念
()重载的类,实现函数功能,和我们之前讲的仿函数是一个东西,可以有参数,也可以有返回值,因为还可以记录类属性,也可以作为参数给成员函数调用

如上,我们实现了自定义的加法和自定义的打印,当然我们也可以接下来加上自定义属性。如输出调用次数

如上,加上自定义属性,输出统计次数
谓词

如上,我们给出定义,返回bool类型仿函数称为谓词,接收一个参数叫做一元谓词,接收2个叫做二元谓词

我们这里借助algorithm模块的find_if实现条件查找,其3个参数,分别为迭代器起始,及谓词仿函数,我们这里就把找到>5的元素作为bool真,其返回对象是迭代器,我们比较和end()是否相等,这里需要注意的是仿函数是实例后的结果,我们要传入一个实例,使用匿名对象

我们之前set章节也用过,sort排序传入仿函数,就是二元谓词
内建函数对象:算数仿函数
STL其实已经给我们内建了很多仿函数,我们只需要导入<functional>

如上,其中negate是一元仿函数,其他都是二元仿函数,当然上面的仿函数都是STL给提供好的,你想用也许,不用也可以自己定义

如上,我们就可以简单的使用自带的一些仿函数,这里当然模板默认都是一个类型,所以<>里只输入一个类型即可
关系仿函数

如上,有一些返回bool的仿函数,里面greater比较常用

如上,我们实现给vector排序,使用algorithm算法,需要传入仿函数,如上,我们实现逆序排序

当然我们也可以使用functional给我们的greater仿函数,这里需要注意别忘了指定<>里的类型

我们可以看sort方法,如果不传第三个参数,是走的下面的模板重载,可以看到默认使用的就是less升序
逻辑仿函数

逻辑仿函数就是与或非,平时用的都不多,这里按逻辑非给讲下,比如我们v1容器都是bool型,然后我们想创建v2容器,将v1容器的每个取反放到v2里

如上,这里我们还学到了一个方法transform,可以将一个容器的内容按规则给另一个容器,其中参数分别为第一个容器的起始,和第二个容器的开始,以及对应得仿函数实例
网友评论