五类迭代器如下:
1、输入迭代器:只读,一次传递
为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是,输入迭代器可以对读操作的结果进行解析(对每个值仅解析一次),然后向前移动。
2、输出迭代器:只写,一次传递
这是对输入迭代器的补充,不过是写操作而不是读操作。为输出迭代器的预定义实现只有ostream_iterator和ostreambuf_iterator,用于向一个输出流ostream写数据,还有一个一般较少使用的raw_storage_iterator。他们只能对每个写出的值进行一次解析,并且只能向前移动。对于输出迭代器来说,没有使用超越末尾的值来结束的概念。总之,输出迭代器可以对写操作的值进行解析(对每一个值仅解析一次),然后向前移动。
3、前向迭代器:多次读/写
前向迭代器包含了输入和输出迭代器两者的功能,加上还可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读/写。顾名思义,前向迭代器只能向前移动。没有为前向迭代器预定义迭代器。
4、双向迭代器:operator--
双向迭代器具有前向迭代器的全部功能。另外它还可以利用自减操作符operator--向后一次移动一个位置。由list容器中返回的迭代器都是双向的。
5、随机访问迭代器:类似于一个指针
随机访问迭代器具有双向迭代器的所有功能,再加上一个指针所有的功能(一个指针就是一个随机访问迭代器),除了没有一种“空(null)”迭代器和空指针对应。基本上可以这样说,一个随机访问迭代器就像一个指针那样可以进行任何操作,包括使用操作符operator[]进行索引,加某个数值到一个指针就可以向前或者向后移动若干个位置,或者使用比较运算符在迭代器之间进行比较。
vector 和deque提供的是RandomAccessIterator,list提供的是BidirectionalIterator,set和map提供的 iterators是 Bidirectional Iterator,hash_set和hash_map的迭代器是Forward Iterator。关于STL中iterator迭代器的操作如下:
迭代器的操作:
每种迭代器均可进行包括表中前一种迭代器可进行的操作。迭代器的操作本质上是通过重载运算符来实现的,迭代器支持何种操作和能够执行什么运算是由迭代器所重载的运算符来决定的。
?只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:
容器 ? ? ? ? ? ? ? ? 支持的迭代器类别 ? ? ? ? ? ?容器 ? ? ? ? ? ? ? 支持的迭代器类别? ? ? ? ? ? 容器 ? ? ? ? ? ? ? ? 支持的迭代器类别
vector ? ? ? ? ? ? ?随机访问 ? ? ? ? ? ? ? ? ? ? ?deque ? ? ? ? ? ? ?随机访问 ? ? ? ? ? ? ? ? ? ? ? list ? ? ? ? ? ? ? ? ? 双向
set ? ? ? ? ? ? ? ? ? 双向 ? ? ? ? ? ? ? ? ? ? ? ? ? ?multiset ? ? ? ? ? ?双向 ? ? ? ? ? ? ? ? ? ? ? ? ? map ? ? ? ? ? ? ? ? 双向
multimap ? ? ? ? ?双向 ? ? ? ? ? ? ? ? ? ? ? ? ? ? stack ? ? ? ? ? ? ? ?不支持 ? ? ? ? ? ? ? ? ? ? ? ?queue ? ? ? ? ? ? ?不支持
priority_queue ? 不支持 ? ? ? ? ? ? ? ? ? ? ? hash_set ? ? 前向 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hash_map ? ? ? ? ? 前向