“迭代器是一个可以遍历
STL
容器内全部或部分元素的对象。一个迭代器用来指出容器中的一个特定位置。”
“迭代器提供一些基本操作符:
*
、
++
、
==
、!
=
、
=
。这些操作和
C/C++
“操作
array
元素”时的指针接口一致。不同之处在于,迭代器是个所谓的
smart pointers
,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型别却不同。这直接导出了泛型程序设计的感念:所有操作行为都使用相同接口,虽然它们的型别不同。“
越往后看,越觉得
STL
的深不可测,如此复杂的数据结构被高度统一起来,越看越觉得激动,激动于如此神妙的技术。至此往后,我未必会多些自己的感慨,但我想我会将使我激动的这些文字一一记录下来。来,咱们继续……
还记得上篇里那个
list
的实例么?现在有一个更漂亮的版本出现了,那就是使用了
list
迭代器的版本。
main
{
/*
…
前面的代码片断省略了。
/*print all elements
list<char>::const_iterator pos;/*
生命一个list的迭代器
for(pos=coll.begin();pos!=coll.end();++pos)
cout<<*pos<<’’;
cout<<endl;
}
迭代器pos声明于循环之前,其型别是“指向容器中的不可变元素”的迭代器:list<char>::const_iterator pos;
所有的容器都可以定义两种迭代器:
container
::iterator
“读/写”模式遍历元素
container
::const_iterator
“只读”模式遍历元素
我们可以看到利用了迭代器之后,就是把判断是否到达边界的任务隐藏起来了。我们不用知道如何判断到达边界。不过,知道其中的原理总是好的,虽然我们有了标准库,我们可以直接调用各种算法,但那只是提高代码的复用性,作为学习本身,我们还是应该知道其所以然的。扯远了…
pos
本身使用++进行递增变化,从头走到尾,并使用*pos来表示其所指向的元素。越来越觉得迭代器像一个封装了一些功能的指针,不是吗?另外,书中建议pos采用这样:++pos的方式递增,即前置式递增。因为这样的效率比pos++更高。原因是:pos++要建立一个额外的临时对象。(汗~~典型的效率优先,C++迷人的地方之一)
迭代器分为:双向迭代器、随机存取迭代器。
好了,迭代器暂告一段落吧。