1 白话迭代器(iterator)
前面其实每个容器介绍的时候都基本解除过迭代器,但是迭代器的使用细节以及不同容器使用条件我觉得还是很有必要好好总结一下,这也就是本文的重点。迭代器在STL中用来将算法和容器联系起来,起着一种胶着剂的作用。
首先我们还是简单回顾下迭代器是什么,迭代器是一种检查容器内元素并遍历元素的数据类型。它是一种行为类似指针的对象,它提供类似指针的功能,对容器的内容进行走访,而指针的各种行为中最常见也最重要的便是“内容提领”和“成员访问”。因此,迭代器最重要的编程工作就是对operator*和operator->进行重载工作。
2 STL中迭代器实战
2.1 迭代器头文件
再熟悉不过,没什么需要说的:
#include<iterator>
using namespace std;
2.2 迭代器类型
几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器类型,用以存取容器中的元素,如vector:
vector<int>::iterator iter; // 将iter声明为int类型的向量迭代器
这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。每个标准库容器类型都定义了一个名为iterator的成员,这里的iterator与迭代器的实际类型相同。术语迭代器通常指的是概念上的迭代器,而术语迭代器类型则是有容器定义的具体的iterator的类型,如vector。
常见的迭代器类型主要有:迭代器类型iterator、元素的只读迭代器类型const_iterator、按逆序寻址元素的迭代器reverse_iterator、元素的只读逆序迭代器const_reverse_iterator。
2.3 迭代器中begin与end
vector<int>::iterator iter = vec.begin();
begin()返回的迭代器指向容器内第一个元素,end()返回的迭代器指向容器内“最后一个元素的下一个位置”,end()操作返回的迭代器并不指向vector中任何实际的元素,它只是起到一个哨兵的作用,表示我们已经处理完vector中的所有元素。
rbegin()返回一个逆序迭代器,它指向容器的最后一个元素,rend()返回一个逆序的迭代器,它指向容器的第一个元素前面的位置。
2.4 迭代器的自增和额外运算
迭代器类型可使用解引用操作符(*操作符)来访问迭代器所指向的元素,解引用操作符返回迭代器当前所指向的元素。但是,不能对end()操作返回的迭代器进行解引用。迭代器也可以使用自增操作符向前移动迭代器指向容器中下一个元素,这在形式上与int型对象的自增操作类似。各个迭代器可以使用的操作如下图所示:
关系操作符只适用于vector和deque容器,这是因为只有这两种容器为其元素提供快速、随机的访问。它们确保可根据元素位置直接有效地访问指定的容器元素。这两种容器都支持通过元素的位置实现随机访问,因此它们的迭代器可以有效地实现算术和关系运算。
C++语言使用一对迭代器来标记迭代器的范围。迭代器范围:[first, last)是一个左闭合区间,表示范围从first开始,到last结束,但不包括last,即last指向容器内最后一个元素的下一个元素。注意:如果first不等于last,则对first反复做自增运算必须能够到达last;否则,即last位于first之前,则将发生未定义行为。迭代器范围使用左闭合的意义:因为这样可以统一表示空集,就无需特别处理。当first和last相等时,迭代器的范围是空。
2.5 各容器的迭代器类型
只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:
3 小结
本文主要介绍了STL库中迭代器的使用注意事项,并不是所有的容器都支持相同的迭代器操作功能,例如stack,queue,priority_queue适配器容器类型就不支持迭代器操作。
以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:http://blog.csdn.net/FX677588/article/details/76400389
参考文献:
http://blog.csdn.net/hero_myself/article/details/52304794