函数对象
概念和使用
- 切记:仿函数,本质是一个类
- 因为是一个类,所以要把
operator()
放在一个类里面
像普通函数(需要通过某个类使用)一样使用,并且有返回值:
内置当前函数对象的状态:
函数对象作为参数:
谓词
- 返回值一定是bool型
- 返回值为bool的仿函数:
- 使用方法:可以在
find_if
这种期待 bool 值的地方使用
* 以后 看到Pred
的形参,就是谓词(仿函数)
- 二原谓词:可以放在排序中使用。这里MyCompare是匿名函数对象
内建函数对象
算数仿函数
关系仿函数
逻辑仿函数
常用算法
遍历
for_each()
transform()
搬运一个容器到另一个
* 记得要使用resize()
提前开辟空间
下面传入vTarget.begin
,即开始迭代器
查找
find
- **切记:**返回值是:迭代器位置
- 自定义类型:
- 在Person类中重载 == ,才能进行自定义类型比较
- 传入要查找的自定义类型,返回值是迭代器
find_if
-
相比
find
可以自定义筛选条件
-
返回:迭代器
-
使用谓词/仿函数
-
内置类型的谓词:
-
自定义类型的谓词:传入类型是Person,
adjacent_find
查找相邻重复元素
binary_search
二分查找
- 内置类型:
count
统计数据的个数
- 内置类型:
- 自定义数据类型
自定义类型,要在Person类型中,添加重载==(下图中忘记添加const Person &p
,防止改变原值)
count_if
- 统计满足某个条件的个数
这种 " if ",都要写仿函数,返回bool值来判断
- 仿函数:
- 自定义类型
排序
sort
- 默认升序
这里用的greater
,也就是期望前面大于后面
random_shuffle
- 指定范围调换次序
merge
- 合并两个有序容器,合并后也有序
reverse
- 反转指定范围
拷贝和替换
copy
replace
replace_if
带有if
的要写谓词
谓词:
swap
- 互换两个容器内部的元素(两个容器类型相同,都是List或者都是Vector)
- 容器大小不同也可以交换
算数生成算法
accumulate
- 自动求和
fill
- 填充某个数值
集合算法
set_intersection
- 必须有序容器
- 开辟较小空间
- 返回值是目标容器的End
- 用目标End作为结束