迭代器(Iterators)
迭代器类似于指针。通常,迭代器指向于容器(序列容器或关联容器)中的元素,因此,借助于迭代器,我们可以成功的访问容器中的各个元素。
迭代器中两个非常常用的操作时++(增量操作符)和*(取值操作符)。假设cntItr为某个容器的迭代器,那么如下语句:
++cntItr;
其结果为增加cntItr,使其指向容器中的下一个元素,相似的如下语句:
*cntItr;
访问cntItr指向的容器中的元素。
迭代器类型
迭代器有五种类型:
输入迭代器(Input Iterators)
输入迭代器,通过逐个元素的读访问,然后,逐个元素的返回,这些迭代器用于从输入流中读取数据。
假设inputIterator是一个输入迭代器,下标描述了inputIterator的操作:
输出迭代器(Output Iterators)
输出迭代器,逐个元素的写访问,这些迭代器用于写数据到输出流中,它们同时也用作插入器(inserter)。
假设outputIterator是一个输出迭代器,下表描述了outputIterator的操作。
注意:输出迭代器不能用来迭代两次,因此,若在相同的位置写数据两次,不能确保新的值一定取代原先的值。
前向迭代器(Forward Iterators)
前向迭代器结合了所有输入迭代器和输出迭代器的功能。假设forwardIterator是一个前向迭代器。下表描述了forwardIterator的操作。
注意:前向迭代器在同一容器中可以指向同一元素,可以多次处理同一个元素。
双向迭代器(Bidirectional Iterators)
双向迭代器是可以向后迭代元素的前向迭代器。假设biDirectionalIterator是一个双向迭代器。那么前向迭代器中定义的操作也可以应用到双向迭代器中。为了向后遍历,biDirectionalIterator中定义了减量操作符。下表描述了双向迭代器的操作。
注意:双向迭代器可以用于vector、deque、list、set、multiset、map和multimap容器。
随机访问迭代器(Random Access Interators)
随机访问迭代器是双向迭代器可以随机的处理容器中的元素,这些迭代器可以用于vector、deque和string容器,以及数组。双向迭代器定义的操作也可以应用于随机访问迭代器。下表描述了随机访问迭代器额外的操作,假设rAccessIterator是一个随机访问迭代器。
下图展示了迭代器的层次结构
现在我们知道各种不同的迭代器类型,接下来我们描述如何在一个容器中声明一个迭代器。
typedef ITERATOR
每个容器(序列容器或关联容器)包含一个typedef iterator,因此,容器中的迭代器通过使用typedef iterator来声明,例如,语句:
Vector<int>::iterator intVecIter;
声明了一个类型为int的vector容器的迭代器intVecIter。
因此iterator是一个在容器内typedef定义的,因此我们必须用合适的容器名,容器元素类型和范围解析操作符来使用typedef iterator。
typedef COSNT_ITERATOR
因为迭代器类似于指针,借助于容器中的迭代器和取值操作符*,我们可以修改容器中的元素,然而,若容器声明为const,那么我们必须防止迭代器修改容器中的元素,尤其是意外情况下的修改。为了处理这种情况,每个容器包含另一个typedef const_iterator。例如,如下语句:
Vector<int>::const_iteratorintConstVecIt;
声明了intConstVecIt作为类型为int的vector容器的迭代器。迭代器intConstVecIt用于处理那些声明的vector容器为常量vector容器中的元素。
类型为const_iterator的迭代器是一个只读迭代器。
typedef REVERSE_ITERATOR
每个容器也包含一个typedef reverse_iterator。这种类型的迭代器用于逆序迭代容器中的元素。
typedef CONST_REVERSE_ITERATOR
这种类型的迭代器是一个只读迭代器,用于逆序迭代容器中的元素。它要求若容器声明为const,那么我们需要以逆序来迭代容器中的元素。
除了前面四种typedefs,还有其他的一些typedefs用于所有的容器,描述如下表: