c++学习(四)——迭代器的介绍及使用

来源:互联网 发布:驾照金手指软件下载 编辑:程序博客网 时间:2024/06/05 00:46

在c++的学习和使用中,我们接触到iterator和Map,这是与使用习惯的C语言不同的,故写下这篇文章,加深对c++迭代器的理解。有不对的地方,请指出,非常感谢。

参考网址:http://www.360doc.com/content/12/1128/13/9290626_250737796.shtml

(1)C++迭代器的介绍:

迭代器提供对一个容器的对象的访问的方法,并且定义了容器中对象的范围。迭代器就如同一个指针,c++中指针也是一种迭代器,但是迭代器不仅仅是指针因此不能认为迭代器一定具有地址值。例如:一个数组索引,也可以认为是一种迭代器。

vector是c++标准模板库中的部分成员,译作“容器”,它是一个多功能的、可作多种数据结构的算法的模板类和函数库。vector可以存放各种类型的对象,即vector是一个能存放任意类型的动态数组,能够增加和压缩数据。

对于vector,除了可以使用下标来访问vector对象元素外,标准库还提供了一种访问元素的方法:迭代器(iterator)。迭代器是一种检查容器内元素并遍历元素的数据类型。

标准库为每一种标准容器定义了一种迭代器类型。迭代器提供了比下标操作更通用化的方法:所以的标准库容器都定义了相应的迭代器类型,只有少数容器支持下标操作。

现代C++程序更倾向于使用迭代器而不是下标。

(2)容器的iterator类型:如vector<int>::iterator it;定义了一个名为it的变量,其数据类型为vector<int>定义的iterator类型。每一个标准容器类型都定义了一个名为iterator的成员。

(3)术语——迭代器和迭代器的类型:由于同一个术语iterator往往表示两个不同的事物:一般意义上指的是迭代器的概念,具体而言时指的是由容器定义的具体的iterator类型。

各容器都定义了自己的iterator类型,用于访问容器内的元素。即每个容器都定义了一个名为iterator的类型,而这种类型知识(概念上)迭代器的各种操作。

(4)由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。 
(5)vector 迭代器的自增和解引用运算: 迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素;迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:    *it = 0;

(6)用 == 或 != 操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。

(7)每种容器类型还定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。使用 const_iterator 类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。 
不要把 const_iterator 对象与 const 的 iterator 对象混淆起来。声明一个 const 迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值。

(8)可以用迭代器算术操作来移动迭代器直接指向某个元素,例如,下面语句直接定位于 vector 中间元素:  vector<int>::iterator mid = vi.begin() + vi.size() / 2; 上述代码用来初始化 mid 使其指向 vi 中最靠近正中间的元素。这种直接计算迭代器的方法,与用迭代器逐个元素自增操作到达中间元素的方法是等价的,但前者的效率要高得多。 
任何改变 vector 长度的操作都会使已存在的迭代器失效。例如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了。

0 0
原创粉丝点击