首页 理论教育 零基础C++从入门到精通:迭代器用法示例及运行结果

零基础C++从入门到精通:迭代器用法示例及运行结果

时间:2023-08-20 理论教育 版权反馈
【摘要】:接下来就让我们看一个示例了解一下:动手写12.1.1动手写12.1.1展示了迭代器的用法。运行结果如图12.1.1所示:图12.1.1迭代器迭代器是声明在每个容器类定义中的,因此在定义的时候我们需要在类型名前面加上具体的容器名和作用域操作符。

零基础C++从入门到精通:迭代器用法示例及运行结果

我们在第5章介绍vector的时候讲解了利用下标操作符遍历的方法,这个方法是vector独有的,并且我们还需要关注索引i是否超过了vector的大小。对于STL中的容器来说,其实我们也有一种通用的遍历方法——使用迭代器(Iterator),这样的话无论我们使用的是哪一种容器,都可以用这种方法一刀切地进行遍历,而不需要关心遍历具体是怎么实现的。

STL中迭代器的设计也体现了泛型和封装的思想,在迭代的时候我们不需要关心容器的内部结构。接下来就让我们看一个示例了解一下:

动手写12.1.1

动手写12.1.1展示了迭代器的用法。运行结果如图12.1.1所示:

图12.1.1 迭代器

迭代器是声明在每个容器类定义中的,因此在定义的时候我们需要在类型名前面加上具体的容器名和作用域操作符。在初始化的时候,我们将容器的begin()的返回值赋值给迭代器,begin()和end()分别代表着指向容器的第一个元素和最后一个元素之后的元素的迭代器,最后一个元素之后的元素并不存在,所以迭代器等于end(),也就说明已经遍历到头了。因为循环的条件一般在循环头部判断,所以如果end()等于最后一个元素,其实就是最后一个元素还没有遍历到。因此,end()的这种特性是比较自然的,这就像遍历数组的循环条件为“i<size”,但是数组最后一个元素的索引是“size-1”一样。

begin()、end()以及迭代器的自增自减操作是迭代器实现遍历的关键。对于vector来说,我们当然知道begin()指向的就是第一个推进去的元素,然而对于其他容器来说,我们并不知道那个begin()指向的是哪个元素。类似地,迭代器的自增自减的实现细节我们也是不需要关心的,无论容器的内部结构如何错综复杂,我们只要让迭代器从begin()到end()递增一遍就能完成遍历了,这也是STL设计中的奇妙之处。

此外,在循环中使用迭代器取容器元素的时候,我们可以把它看作指针,并使用解引用操作即可。(www.xing528.com)

既然迭代器可以正向遍历,那应该也可以反向遍历。下面我们来看一下两种反向遍历的方法:

动手写12.1.2

动手写12.1.2展示了反向遍历容器的两种方法,运行结果如图12.1.2所示:

图12.1.2 反向遍历

在本示例中,我们先使用了递减迭代器的方法反向遍历,这样需要先递减再打印并判断,因为迭代器指向begin()的时候如果先判断是否已终止循环,就无法取得元素了。但是在使用反向迭代器的时候就不存在这个问题,因为rbegin()指向的是容器的最后一个元素,而rend()指向的是第一个元素之前的元素,所以在遍历的时候可以先取得第一个元素之后再终止循环。

由于迭代器的定义比较冗长,我们也可以像示例中那样使用typedef简化迭代器的类型名。

最后,迭代器除了示例中出现过的自增自减、关系以及解引用操作符之外,在vector和deque中也可以使用其他的一些算术和关系操作符。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈