1. 输入迭代器:只读,一次传递
为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是,输入迭代器可以对读操作的结果进行解析(对每个值仅解析一次),然后向前移动。
2. 输出迭代器:只写,一次传递
这是对输入迭代器的补充,不过是写操作而不是读操作。为输出迭代器的预定义实现只有ostream_iterator和ostreambuf_iterator,用于向一个输出流ostream写数据,还有一个一般较少使用的raw_storage_iterator。他们只能对每个写出的值进行一次解析,并且只能向前移动。对于输出迭代器来说,没有使用超越末尾的值来结束的概念。总之,输出迭代器可以对写操作的值进行解析(对每一个值仅解析一次),然后向前移动。
3. 前向迭代器:多次读/写
前向迭代器包含了输入和输出迭代器两者的功能,加上还可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读/写。顾名思义,前向迭代器只能向前移动。没有为前向迭代器预定义迭代器。
4. 双向迭代器:operator–
双向迭代器具有前向迭代器的全部功能。另外它还可以利用自减操作符operator–向后一次移动一个位置。由list容器中返回的迭代器都是双向的。
5.随机访问迭代器:类似于一个指针
随机访问迭代器具有双向迭代器的所有功能,再加上一个指针所有的功能(一个指针就是一个随机访问迭代器),除了没有一种“空(null)”迭代器和空指针对应。基本上可以这样说,一个随机访问迭代器就像一个指针那样可以进行任何操作
,包括使用操作符operator[]进行索引,加某个数值到一个指针就可以向前或者向后移动若干个位置,或者使用比较运算符在迭代器之间进行比较。
容器的迭代器种类:
连续空间储存的容器对应的迭代器是随机访问迭代器random_access_iterator_tag,可以每次跨越多个元素(it+n)。非连续储存的容器对应的迭代器是单向迭代器forward_iterator_tag或者双向迭代器bidirectional_iterator_tag,取决于每个结点内部的指针情况,这两种迭代器每次只能移动一位(it++)不能跳跃访问。
迭代器分类对算法的影响:
对于处理不同类型的迭代器,相同的算法可能会有不同的实现方式。
例如:计算两个迭代器的距离的算法,对连续储存的容器其迭代器类型为 random_access_iterator_tag,可将两个迭代器相减得到距离。而非连续储存的容器需要不断将第一个迭代器进行++运算,直到等于第二个迭代器,执行++的步数即为距离。
算法通过萃取机iterator_traits获得迭代器的类型,从而执行不同的处理方法。
逆向迭代器:
是一种迭代器适配器iterator adapter