8、泛型程序设计与c++标准模板库3.迭代器

网友投稿 725 2022-11-27

8、泛型程序设计与c++标准模板库3.迭代器

8、泛型程序设计与c++标准模板库3.迭代器

理解迭代器对于理解STL框架并掌握STL的使用至关重要。简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法

虽然指针也是一种迭代器,但迭代器却不仅仅是指针。指针可以指向内存中的一个地址,通过这个地址就可以访问相应的地址。而迭代器更为抽象,它可以指向容器中的一个位置,我们也许不必关心这个位置的真正物理地址,但是我们可以通过迭代器访问这个位置的元素。

迭代器是算法和容器的“中间人”,遍历链表需要指针,对数组元素进行排序要通过下标来访问数组元素。那么,指针和下标运算符便充当了算法和数据结构的“中间人”;在STL中,容器是封装起来的类模板,其内部结构无从知晓,我们只能通过容器接口来使用容器,但是STL中的算法是通用的函数模板,并不专门针对那一个容器类型。这时请想一想:算法要适用于多种容器,而每一种容器存放的元素又可以是任何类型,如何用普通的指针或下标类充当中介呢?使用指针需要直到其指向的元素类型,使用下标需要在相应的容器中定义过下标操作符,但不是每个容器中都有下标操作符的。这时就必须使用更为抽象的指针--迭代器。

1、迭代器的类型

为了满足某些特定算法的需要,STL迭代器主要包括5种基本迭代器类别:输入、输出、前向、双向和随机访问,以及两种迭代器适配器:逆向迭代器适配器和插入迭代器适配器。

1)迭代器分类

输入迭代器对象可以用来从序列中读取数据,但是不一定能够向其中写入数据。输出迭代器具有刚好相反的功能,它允许向序列中写入数据,但是并不保证可以从其中读取数据。

前向迭代器既是输入迭代器又是输出迭代器,因此它即支持数据读取,也支持数据写入,并且可以对序列进行单向的遍历。

双向迭代器的功能与前向迭代器相似,不同之处在于,双向迭代器在两个方向上都可以对数据遍历。也就是说,双向迭代器必须支持前向迭代器的所有操作,此外,还必须支持双向操作,从而使对序列进行反向遍历。

随机访问迭代器也是双向迭代器,它对迭代器提供了更高的要求,能够在序列中的任意两个位置之间进行跳转。

2、迭代器适配器

适配器是用来修饰或调整其他类接口的,迭代器适配器便是用来扩展(或调整)迭代器功能的类。当然这样的适配器本身也称为迭代器,只是这种迭代器是通过改变另一个迭代器而得到的。STL中定义了两类迭代器适配器:

逆向迭代器是一种适配器,它通过重新定义递增运算和递减运算,使其行为正好倒置。这样,使用这类迭代器,算法将以逆向次序处理元素。所有标准容器都允许使用逆向迭代器来遍历元素。

插入型迭代器用来将赋值操作转换为插入操作。通过这种迭代器,算法可以执行插入行为而不是覆盖行为。c++标准程序库提供了3种插入型迭代器:后插入型迭代器、前插入型迭代器、普通插入型迭代器。

例子:

应用逆向迭代器和后插迭代器来操作向量容器中的元素

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:实时数据中心建设思路与企业实践|青训营笔记
下一篇:两天时间,实现自己的 Promise
相关文章

 发表评论

暂时没有评论,来抢沙发吧~