迭代器是一种能够遍历某个序列或容器的所有元素的对象,所有容器都有各自的迭代器,当开发人员使用某种容器的迭代器时,不需要包含特别的头文件,但是如果要使用逆向迭代器、插入型迭代器、流迭代器,则需要包含< iterator>头文件。
迭代器共分为五种,分别为: Input iterator(输入型迭代器)、Output iterator(输出型迭代器)、Forward iterator(前向迭代器)、Bidirectional iterator(双向迭代器)、Random access iterator(随机存取迭代器)。


1、Input(输入)迭代器

只能一次一个向前读取元素,按此顺序一个个传回元素值。Input迭代器只能读取元素一次,因为迭代器进行读取操作后会立即进行++操作,如果你复制Input迭代器,并使原Input迭代器与新产生的副本都向前读取,可能会遍历到不同的值。纯粹Input迭代器的一个典型例子就是“从标准输入装置(通常为键盘)读取数据”的迭代器。


2、Output(输出)迭代器

Output迭代器和Input迭代器相反,其作用是将元素值一个个写入。Output iterator*只有在赋值语句的左手边才有效。迭代器进行写操作后会立即进行++操作,Output迭代器无需比较(comparison)操作。你无法检验Output迭代器是否有效,或“写入动作”是否成功。你唯一可以做的就是写入、写入、再写入。


3、Forward(前向)迭代器

Forward迭代器是Input迭代器与Output迭代器的结合,具有Input迭代器的全部功能和Output迭代器的大部分功能。Forward迭代器能多次指向同一群集中的同一元素,并能多次处理同一元素。


4、 Bidirectional(双向)迭代器

Bidirectional(双向)迭代器在Forward迭代器的基础上增加了回头遍历的能力。换言之,它支持--操作符,用以一步一步的后退操作。

5、Random Access(随机存取)迭代器

Random Access迭代器在Bidirectional迭代器的基础上再增加随机存取能力。因此它必须提供“迭代器算数运算”(和一般指针“指针算术运算”相当)。也就是说,它能加减某个偏移量、能处理距离(differences)问题,并运用诸如<和>的相互关系操作符进行比较。以下对象和型别支持Random Access迭代器:可随机存取的容器(vector, deque)、strings(字符串,string,wstring)、一般array(指针)。
下面是整理的各迭代器所能支持的操作及说明:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


6、Reverse(逆向迭代器)

逆向迭代器重新定义递增运算和递减运算,使其行为正好倒置。成员函数rbegin()和rend()各传回一个Reverse迭代器,和begin()和end()类似,共同定义一个半开区间。用正向迭代器可以直接构造一个逆向迭代器,但是构造之后会出现“错位”现象。原因在逆向迭代器要保证半开区间不会越界,可调用逆向迭代器的base()函数,保证转换值的正确性(迭代器移了一位)。

7、Insert(安插型)迭代器

Insert迭代器,也称为inserters,用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插(insert)行为而非覆盖(overwrite)行为。所有Insert迭代器都隶属于Output迭代器类型。所以它只提供赋值(assign)新值的能力。
表达式            功能表述
*iter           无实际操作(传回iter)
iter = value    安插value
++iter          无实际操作(传回iter)
iter++          无实际操作(传回iter)    
                                           
C++标准程序库提供三种Insert迭代器:back inserters, front inserters, general inserters。它们的区别在于插入位置。事实上它们各自调用所属容器中不同的成员函数。


8、Stream(流)迭代器

Stream迭代器是一种迭代器配接器,通过它,你可以把stream当成算法的原点和终点。更明确的说,一个istream迭代器可以用来从input stream中读元素,而一个ostream迭代器可以用来对output stream写入元素。
Stream迭代器的一种特殊形式是所谓的stream缓冲区迭代器,用来对stream缓冲区进行直接读取和写入操作。
ostream迭代器 可以被赋予的值写入output stream中。istream迭代器是ostream迭代器的拍档,用来从input stream读取元素。透过istream迭代器,算法可以从stream中直接读取数据。istream迭代器的各项操作。

9、辅助迭代器函数

STL提供三个辅助函数:advance(),distance(), 以及iter_swap().那前两个函数给了所有迭代器一些能力,平常这些能力只有random access iterators拥有:向前移动多个位置和处理两个迭代器的差值。第三个函数允许你交换两个迭代器的值。
1、advance()函数:

#include < iterator>
void advance (InputIterator& pos, Dist n)

1.让input iterator pos 向前前进N个元素。
2.对于Forbidirectional 和 random access iterators N也许是负数。
3.Dist 是个模板参数,一般它是整型,因为像这样的操作<,++, --, and于0比较被调用。
4.该函数不检查传递的迭代器是不是容器的end().所以在用时一定要注意。由于用到了 iterator traits, 该函数总是用最好的执行方式,因为它依赖于iterator category。对于random access iterators, 它只是简单的调用pos+=n,对于其它的迭代器它调用 ++pos  n 次。


2、distance()函数

#include < iterator>
Dist distance (InputIterator pos1, InputIterator pos2)

1.返回两个迭代器之间的距离。
2. 两个迭代器一定要指向同一个容器
3.   如果迭代器不是random access iterators,,那个pos2一定不能在pos1的后面,可以在同一个位置。
4.返回值的类型依赖于迭代器的类型;iterator_traits< InputIterator>::difference_type。该函数也用到了iterator traits, 所以总是用最好的执行方式。

3、iter_swap()函数

#include < algorithm>
void iter_swap (ForwardIterator1 pos1, ForwardIterator2 pos2)

1.交换两个迭代器的值
2. 迭代器不要求是同一种类型,但是值要是可赋值的。