泛型算法(generic algorithm)是为了实现对容器元素的多种操作而设计的。
算法永不执行容器提供的操作:泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。
对于写容器元素的算法,必须确保算法所写的序列至少足以存储要写入的元素。
对于不检查写入操作的算法,需要弄清楚操作是否合法哦。也可以引入back_inserter,相当于在vec上调用push_back
目标迭代器指向存放输出数据的序列中第一个元素
有些算法提供所谓的“复制(copying)”版本。这些算法对输入序列的元素做出处理,但不修改原来的元素,而是创建一个新序列存储元素的处理结果。
标准库所定义的迭代器不依赖于特定的容器。
C++中定义的另外三种迭代器:插入迭代器(insert iterator),iostream迭代器(iostream iterator),反向迭代器(reverse iterator)
插入迭代器:1.back_inserter,创建使用push_back实现插入的迭代器
2.front_inserter,使用push_front实现插入
3.inserter,使用insert实现指定位置的插入操作
iostream类型虽不是容器,可标准库提供了迭代器istream_iterator用于读取输入流,ostream_iterator用于写输出流。
反向迭代器是一种反向遍历容器的迭代器。它提供了自增(自减)的操作,不过都是反过来的。
const迭代器不能用来容器中的元素
根据功能将迭代器操作分别五种
输入迭代器 | 读,不能写:只支持自增运算 |
输出迭代器 | 写,不能读:只支持自增运算 |
前向迭代器 | 读和写:只支持自增运算 |
双向迭代器 | 读和写:支持自增和自减运算 |
随机访问迭代器 | 读和写:支持完整的迭代器算术运算 |
泛型算法的形式有:
alg(beg,end,other parms);
alg(beg,end,dest,other parms);
alg(beg,end,beg2,other parms);
alg(beg,end,beg2,end2,other parms);
标准库的命名和重载规范包括两种重要模式:第一种模式包括测试输入范围内元素的算法,第二种模式则应用于对输入范围内元素重新排序的算法。
list容器上的迭代器是双向而非随机访问的。有很多需要随机访问迭代器的算法不能在list上使用。