STL中所谓算法是用来处理容器的非成员函数,有两个通用部分:
1.模板:提供数据的泛型
2.迭代器:提供访问容器值的通用表示
STL算法种类:
1.非修改式序列操作,find(),for_each()
2.修改式序列操作,transform(),random_shuffle(),copy()
3.排序和相关操作,sort()
4.通用数字运算
前3种在头文件algorithm中,最后一种在头文件numeric中
就地算法:结果放在原始数据的位置,例如sort
复制算法:将结果发送到其他位置,例如copy
很多算法有两个版本,STL规定,以_copy结尾的是复制版本,复制版本返回一个迭代器,指向最后一次复制的值的后面一个位置,例如对于replace算法:
/* 将old用new替换,同时读写,所以至少是正向迭代器 */
template<typename ForwardIterator, typename T>
void replace(ForwardIterator first, ForwardIterator last,
const T & old, const T & new);
/* 复制到另一个地址,所以区分输入迭代器和输出迭代器,注意返回值 */
template<typename InputIterator, typename OutputIterator, typename T>
OutputIterator replace_copy(InputIterator first, InputIterator last,
OutputIterator result, const T & old, const T & new);
_if后缀:有些算法根据提供的函数符对容器元素进行操作的结果来执行操作,例如replace_if,如下:
/* Predicate是一元谓词,这里对旧值应用这个谓词,若返回true,那么替换成新值 */
template<typename ForwardIterator, typename Predicate, typename T>
void remove_if(ForwardIterator first, ForwardIterator last, Predicate pred,
const T & new_value);
next_permutation()算法:提供唯一的排列组合,顺序是字典序
算法和容器的成员函数:应该尽量使用容器的成员函数,两个原因:
1.成员函数对特定容器性能好
2.成员函数有权力管理容器的内存,可以动态管理大小
使用算法的场景:混合容器,例如将vector容器存储到链表或集合中