STL中迭代器

迭代器(Iterators)

迭代器类似于指针。通常,迭代器指向于容器(序列容器或关联容器)中的元素,因此,借助于迭代器,我们可以成功的访问容器中的各个元素。

 

迭代器中两个非常常用的操作时++(增量操作符)和*(取值操作符)。假设cntItr为某个容器的迭代器,那么如下语句:

++cntItr;

其结果为增加cntItr,使其指向容器中的下一个元素,相似的如下语句:

*cntItr;

访问cntItr指向的容器中的元素。

 

迭代器类型

迭代器有五种类型:

  • 输入迭代器(Input Iterators)
  • 输出迭代器(Output Iterators)
  • 前向迭代器(Forward Iterators)
  • 双向迭代器(Bidirectional Iterators)
  • 随机访问迭代器(Random Access Iterators)

 

输入迭代器(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用于所有的容器,描述如下表:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值