1. STL 算法分类
STL 中的算法大致可以分为以下七类:
- 不变序列算法
- 变值算法
- 删除算法
- 变序算法
- 排序算法
- 有序区间算法
- 数值算法
大多重载的算法都是有两个版本的:
- 用 “==” 判断元素是否相等,或用 “<” 来比较大小
- 多出一个类型参数 “Pred” 和函数形参 “Pred op”:通过表达式判断 “op(x,y)” 的返回值:true/false。(判断 x 是否“等于” y,或者 x 是否 “小于” y)。
如下面的有两个版本的 min_element:
iterator min_element(iterator first, iterator last);
iterator min_element(iterator first, iterator last, Pred op);
1 不变序列算法
- 该类算法不会修改算法所作用的容器或对象
- 适用于顺序容器和关联容器
- 时间复杂度都是 O(N)。
2 变值算法
- 此类算法会修改源区间或目标区间元素的值
- 值被修改的那个区间,不可以是属于关联容器的
3 删除算法
删除一个容器里的某些元素
删除不会使容器里的元素减少
- 将所有应该被删除的元素看做空位子
- 用留下的元素从后往前移,依次去填空位子
- 元素往前移后,它原来的位置也就算是空位子
- 也应由后面的留下的元素来填上
- 最后,没有被填上的空位子,维持其原来的值不变
删除算法不应作用于关联容器
- 算法复杂度都是 O(N)。
4 变序算法
- 变序算法改变容器中元素的顺序,但是不改变元素的值
- 变序算法不适用与关联容器
- 算法复杂度都是 O(N)。
5 排序算法
- 比前面的变序算法复杂度更高,一般是 O(Nlog(N))
- 排序算法需要随机访问迭代器的支持
- 不适用于关联容器和 list
6 有序区间算法
- 要求所操作的区间是已经从小到大排好序的
- 需要随机访问迭代器的支持
- 有序区间算法不适用于关联容器和 list