迭代器是一个“可遍历STL容器内全部或部分元素”的对象。一个迭代器用来指出容器中的一个特定位置。迭代器奉行一个纯粹抽象概念:任何东西,只要行为类似迭代器,就是一种迭代器。
迭代器的分类(Iterator Categories)
根据能力的不同,迭代器被划分为五种不同类别。
迭代器类型(category) | 能力 | 供应者 |
Input迭代器 | 向前读取(read) | istream |
Output迭代器 | 向前写入(write) | ostream,inserter |
Forward迭代器 | 向前读取和写入 |
|
Bidlrectional迭代器 | 向前和向后读取和写入 | list,set,multiset,map,mulitimap |
Random access迭代器 | 随即存取,可读取也可写入 | vector,deque,string,array |
STL预先定义好的所有容器,其迭代器均属于以下两种类型:Bidlrectional迭代器、随即存取迭代器(Random access iterator)。
迭代器的基本操作
l Operator*
l Operator++
l Operator==和Operator!=
l Operator=
所有容器类别都提供有一些成员函数,使我们得以获得迭代器并以之遍访所有元素。这些函数中最重要的是:
l begin()
返回一个迭代器,指向容器起始点,也就是第一个元素(如果有的话)的位置。
l end()
返回一个迭代器,指向容器结束点。结束点在最后一个元素之后,这样的迭代器又称为“逾尾(past-the-end)”迭代器。
图1 容器的begin()和end()成员函数
迭代器的型别
任何一种容器都定义有两种迭代器型别:
l container::iterator
以“读/写”模式遍历元素。
l container::const_iterator
以“只读”模式遍历元素。
迭代器相关辅助函数
C++标准程序库为迭代器提供了三个辅助函数:advance(),distance()和iter_swap()。
辅助函数 | 说明 |
advance() | 前进(或后退)多个元素。 |
distance() | 处理迭代器之间的距离。 |
iter_swap() | 可交换两个迭代器所指元素的内容。 |
迭代器之配接器(Iterator Adapters)
C++标准程序库提供了数个预先定义的特殊迭代器,亦即所谓迭代器适配器(iterator adapters)。它们不仅起辅助作用,还能赋予整个迭代器抽象概念更强大的能力。
l Insert Iterators(安插型迭代器)
l Stream Iterators(流迭代器)
l Reverse Iterators(逆向迭代器)
1. Insert Iterators
预先定义的三种Insert Iterators
算式(expression) | Inserter种类 | 容器 |
back_inserter(container) | 使用push_back()在容器尾端安插元素,元素排列次序和安插次序相同。 | vector,deque,list |
front_inserter(container) | 使用push_front()在容器前端安插元素,元素排列次序和安插次序相反。 | deque,list |
inserter(container, pos) | 使用insert()在pos位置上安插元素,元素排列次序和安插次序相同。 | 所有STL容器。 |
2. Stream Iterators
Stream迭代器是一种迭代器配接器,通过它,你可以把stream当成算法的原点和终点。
l Ostream迭代器 可以将被赋予的值写入output stream中。
l Istream迭代器 用来从input stream中读取元素。
3. Reverse Iterators
Reverse Iterators将Increment(递增)运算转换为decrement(递减)运算,反之亦然。所有容器都可以透过成员函数rbegin()和rend()产生出Reverse Iterators。
l rbegin()
传回逆向遍历的第一元素位置,也就是实际上最后一个元素的位置。
l rend()
传回逆向遍历时最后一个元素的下一个位置,也就是实际上第一个元素的前一个位置。
你也可以将一般迭代器转换成一个Reverse迭代器。当然,原本那个迭代器必须具有双向移动能力。注意:转换前后迭代器的逻辑位置发生了变化。