本节与迭代器的类型密切相关。
0. 约定
- beg和end表示元素范围的迭代器,几乎所有的算法都有一对由beg和end表示的序列进行操作。
- beg2表示第二个输入序列开始位置的迭代器。end2表示第二个序列的末尾位置。如果没有end2,算法假定beg2表示的序列与第一个序列表示的一样大。
- 两个序列类型不必匹配,但是必须保证两个序列的元素都可以执行特定操作或者调用给定的可调用对象。
- unaryPred 和binaryPred表示一元和二元谓词,分别接受一个或者两个参数
- unaryOp和binaryOp是可调用对象,分别使用来自输入序列的一个和两个实参来调用
1. 查找对象的算法
简单查找算法
- 要求是输入迭代器。
查找重复值的算法
- 要求前向迭代器
返回end.
查找子序列的算法
- find_first_of: 一个输入迭代器,一个前向迭代器
- 之外,都是两个前向迭代器
2. 其他只读算法
- 两个输入迭代器
3. 二分搜索算法
- 随机访问迭代器的话,这类算法的性能好很多。
- 算法要求元素有序
附录:
关于二分搜索的算法实现细节:link
4. 写容器元素的算法
只写不读元素的算法
- 输出迭代器
_n
版本接受第二个实参,表示写入元素的目录
使用输入迭代器的写算法
- 输入范围是输入迭代器
- 输出范围要求名为dest的输出迭代器
此外还有使用前向迭代器和双向迭代器的写算法,不再赘述。有需求就去查看《C++ Primer》
5. 划分与排序算法
所有的排序和划分算法都提供了稳定和不稳定版本。
稳定算法保证相等元素的相对顺序。
划分算法
划分算法将输入范围中的元素划分为两组,一组包含满足谓词的元素,第二足包含不满足谓词的元素。
均要求双向迭代器
排序算法
算法要求随机访问迭代器。
6. 通用重排操作
算法基本版本都是原址操作
提供_copy拷贝版本
使用前向迭代器的重排算法
使用双向迭代器的重排算法
使用随机访问迭代器的重排算法
7. 排列算法
什么是下一个或前一个排列?
- 算法假定序列中的元素是唯一的。
- 双向迭代器
8. 有序序列的集合算法
9. 最大最小值
10. 数值算法
- 头文件numeric