7.3.STL迭代器 下载本文

内容发布更新时间 : 2024/5/20 16:35:17星期一 下面是文章的全部内容请认真阅读。

http://www.5itjob.com

迭代器

【ITjob课程资料】

迭代器

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。标准库为每一种标准容器(包括 vector等)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代 C++程序更倾向于使用迭代器而不是使用下标操作访问容器元素,即使对支持下标操作的 vector 类型也是这样。

迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和C/C++“操作array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的智能指针,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器类型都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套类的方式定义于内部。因此各种迭代器的接口相同,类型却不同。这直接导出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的类型不同。

iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent =m_pCurrent-> pNext;的操作。因此每种容器都有自己的iterator实现方法。

iterator的常用方法有: iterator++ 移到下个元素; iterator-- 移到上个元素;

*iterator 访问iterator所指元素的值; < > == != iterator之间的比较;

iterator1+iterator2 iterator之间的加法运算,类似于指针加法;

迭代器是种类型,在程序中使用的是其对象。从迭代器的层面上看,对所有类型容器元素的访问应该是等价的,因此,迭代器对象应具备以下功能:

(1) 间接访问(*p),在迭代器类中必须对一元*操作符定义。

(2) 迭代器对象之间的赋值,如p=q,在迭代器类中必须对赋值操作符定义。

(3) 迭代器对象间的比较,比较两个迭代器是否相等,因此,在迭代器类内必须对关系运算符==和!=进行定义,原则上讲,不需要对迭代器进行大小比较(<、>)等,就像比较指针实际上是比较其中存储的地址大小一样,没有意义。

(4) 能使用迭代器遍历容器中所有的元素,在本章已给出的示例代码中已经大量应用了诸如“p++”之类的操作,因此,在迭代器类必须对前缀增1和后缀增1进行定义。

在7.2节中,我们在例7.1中我们定义并使用了vector::iterator it;类型的迭代器;在例7.2中定义并使用了list::iterator iter;类型的迭代器;在例7.4中定义并使用了vector::iterator it = x.begin();类型的迭代器;在例7.5中定义并使用了list::iterator iter=obL.begin();类型的迭代器;在例7.6中定义并使用了set::iterator it = A.begin();类型

http://www.5itjob.com

的迭代器;在例7.7中定义并使用了multiset::iterator it = A.begin();类型的迭代器;在例7.8中定义并使用了map::iterator it = obM.begin();类型的迭代器;在例7.9中定义并使用了multimap::iterator it = obM.begin();类型的迭代器;在例7.10中定义并使用了map::iterator itM = obM.begin();类型的迭代器;在例7.11中定义并使用了map::iterator p = obM.begin();类型的迭代器;在7.12中定义并使用了map::iterator itM = obM.begin();类型的迭代器;在例7.13中定义并使用了map:: iterator和multimap::iterator;类型的迭代器。在使用这些迭代器的时候一般是起到遍历容器中元素的作用。

相关资料与视频请访问ITjob就业培训网