很多地方用到迭代器,究竟迭代器有什么用,意义何在?
很多地方用到迭代器,究竟迭代器有什么用,意义何在?
什么情况下会用到它呢?
问题点数:20、回复次数:19Top
1 楼ZhengxinLiu()回复于 2005-10-12 14:21:06 得分 0
最典型的用处就是使container和algorithm分离Top
2 楼goodboy1881(积木)(谁都别拦着我在水源升星)回复于 2005-10-12 18:58:31 得分 0
提供你一个便利的数据结构遍历接口。
使得你不用关心一个容器的内部结构(不管是树,还是HashTables,还是别的数据结构),
就可以写出很好的数据处理代码,
你也可以通过给容器添加迭代器的方式,使得容器适应某种处理方式。
就是实现了 容器 和 处理的 解耦Top
3 楼steel007(小宝)(工作在windows和linux平台上)回复于 2005-10-16 01:46:07 得分 0
恩
iterator是algorithm和container的粘合剂,你可以看看stl,用用其中的类就知道了Top
4 楼xiaonian_3654(你猜猜(我要打光棍,小乔嫁不了))回复于 2005-10-18 17:28:09 得分 0
Iterator只不过是封装过的Pointer而已Top
5 楼Polarislee(北极星)(无房无车,飘在北京)回复于 2005-10-26 19:25:02 得分 0
你可以把iterator的功能和pointer进行类比,它是外界访问STL容器的途径,它可以封装不同STL容器的物理存储方式的区别,从而使你可以以统一的方式对容器进行访问
Top
6 楼lnxydl(网络呆呆虫)回复于 2005-10-28 09:01:25 得分 0
我就把他当成pointer来使用,不错Top
7 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-12-14 10:22:23 得分 0
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然涉及到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。
然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。
而迭代器模式的出现,很好的解决了上面两种情况的弊端。先来看下迭代器模式的真面目吧。
迭代器模式由以下角色组成:
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。
迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符号“单一职责原则”。
注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。这被称为多态迭代
Top
8 楼NoInfoNoFear(无知)回复于 2006-01-10 16:32:45 得分 0
可以这样理解迭代器:
迭代器是指针功能的一种抽象,它提供了类似C语言的指针的功能,如*, ++, --等。
大多数迭代器的功能比指针少,它们将指针的部分功能封装成一个类(模板类)。
随机访问迭代器最象指针,功能最接近指针。
指针可以看做一个“功能最强”(可能是较强)的迭代器。.
你可以看看:
http://www.cs.brown.edu/people/jak/proglang/cpp/stltut/tut.html
中文:
http://groups.google.com/group/CppSTLTop
9 楼wangyangcheng(矛盾)回复于 2006-02-18 00:32:17 得分 0
回复人: ZhengxinLiu() ( ) 信誉:100 2005-10-12 14:21:07 得分: 0
最典型的用处就是使container和algorithm分离
Top
10 楼truemann(CodingWithJoy)回复于 2006-03-07 23:48:22 得分 0
最深刻的理解就一句话:
实现与算法的分离.Top
11 楼onlyxuyang()回复于 2006-03-18 15:05:21 得分 0
.........我给个好理解点的说法
迭代器就是把不同的数据结构"相同功能"的函数装到一个名字相同的函数里
这样的话你在写算法的时候就可以不管你要操作的数据结构的逻辑结构了
比如不管是链表,数组还是别的什么.统一都用迭代器进行访问的话可能都是 Next()表示下一个元素 Pre()表示上一个元素等等
也许理解比较粗浅,大家不要笑我..........Top
12 楼KDE(黎明)回复于 2006-03-22 21:46:47 得分 0
唉!!!兄弟们真是个个专业级啊!!!!
我来说说,其实意思就是,不管你用的是链表,2叉树、3叉树、N叉树,还是向量。
迭代器都可以让你从first开始,使用next,到达last,而且一个不漏滴都走一遍。
你不必知道在next的时候,迭代器是怎样从当前节点跳到下一个节点的。
就和猴子一样,你不必知道猴子是怎样从这个树的节点跳到那个树的!总之,猴子
可以把树的所有节点跳一边(再次强调:一个不漏)。Top
13 楼pandaxcl(开心)回复于 2006-04-18 21:55:27 得分 0
我的博客上面有关于游标的文章,是关于如何自己写一个和STL兼容的自定义游标的,或许对你有所帮助:)
我的博客:http://blog.csdn.net/pandaxcl/Top
14 楼xlsue(小林)回复于 2006-04-22 00:24:16 得分 0
智能指针。看源码能使你解开谜团Top
15 楼KDE(黎明)回复于 2006-04-25 15:50:55 得分 0
唉,说了那么多。
还不如一句话搞定,就看楼住的理解了:
迭代器是:
无论你用的是什么结构(链表也好、数组也好、数也好、图也好、hash表也好),总之,
你可以不关心任何细节遍历细节,(下面看好了)
从一个起点(begin)触发到达,到达终点(end),并且保证每个节点都能走到且只走一次。
这个问题我好像回答过几次了。。。。。Top
16 楼xlsue(小林)回复于 2006-04-27 21:23:19 得分 0
lz找本书来看,毕竟论坛不能代替教程啊Top
17 楼gjianpro(#ifndef _DEBUG)回复于 2006-04-27 22:12:13 得分 0
STL将迭代器概念分为5类:输入迭代器,用于刻划输入;输出迭代器,用于指示输出;前向迭代器,可以单向前移;双向迭代器,可以双向移动;随机存取迭代器,支持随机存取。Top
18 楼gjianpro(#ifndef _DEBUG)回复于 2006-04-27 22:14:03 得分 0
迭代器模式算法往往和相应数据结构(存储结构)联系在一起,从而形成紧密的偶合关系。假设有N个不同的算法,M种不同的数据结构,可能需要N×M个不同的算法实现代码,给泛型程序库的实现者和使用者带来极大的负担;同时,亦使库中已有的数据结构和算法难以扩充。因此,长期以来未有合适的数据结构和算法库。软件工程中的许多设计问题可通过增加间接层方法来加以解决. GangOfFour归纳了经常遇到的软件设计问题,形成了可再现的解决方案,提出了23种设计模式。其中有一种行为型模式称为迭代器模式,容许算法使用一个标准接口,即迭代器,依序访问一个数据集。STL应用迭代器模式,提供了vector、list、deque等序列式容器和set、map、multiset、multimap等关联式容器,实现了各种常用数据结构和泛型算法;同时,每一种STL泛型容器都提供了各自相应的迭代器,作为容器的接口,算法通过迭代器访问容器。STL算法和容器(数据结构)得到了分离,打破了算法和数据结构的偶合关系,迭代器成为泛型容器和泛型算法的粘合剂。STL实现者无须再为不同的容器分别编写不同的算法实现代码,STL使用者可以自行增加新泛型容器、新泛型算法,使STL具有了开放构架。Top
19 楼crybird(寒号鸟)回复于 2006-07-03 12:40:18 得分 0
如果只从表面说,很简单的说
遍历一个数组、链表用什么?--指针
遍历一个容器用什么?--------迭代器Top




