




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第三章 迭代器n3.1什么是迭代器 n3.2迭代器类位置 n3.3进一步理解迭代器 n3.4STL迭代器 3.1 什么是迭代器n迭代器即是指针,可以是所需要的任意类型,它的最大的好处是可以使容器和算法分离开来。常规思维是每个容器类中有自己的显示、查寻、排序等函数。仔细分析可得出:不同容器中完成相同功能代码的思路大体是相同的,那么能不能把它们抽象出来,多个容器仅对应一个显示、一个查询、一个排序函数 呢?这是泛型思维发展的必然结果。 n【例3.1】为数组容器、链表容器编制共同显示函数。 数组类MyArray初始代码如下所示。/文件名:e3_1.cpp(本示例中所有头文件及源文件内容都在该文件中)
2、#include template class MyArrayprivate:int m_nTotalSize; /数组总长度int m_nValidSize;/数组有效长度T *m_pData;/数据public:MyArray(int nSize = 3)/数组默认总长度是3m_pData = new TnSize;m_nTotalSize = nSize;m_nValidSize = 0;void Add(T value)/向m_pData添加数据 同例1.1int GetSize()/返回数组有效长度return m_nValidSize;T Get(int pos)/返回某一位置元素
3、return m_pDatapos;n链表类MyLink初始代码如下所示。template struct Unit/链表单元T value;Unit *next;template class MyLinkUnit *head; /链表头Unit *tail; /链表尾Unit *prev;public:MyLink()head = tail = prev = NULL;void Add(T &value)/向链表中添加元素Unit * u = new Unit();u-value = value;u-next = NULL;if(head = NULL)head = u;prev = u;图3
4、-1 Java 2 SDK,SEv1.4.2-License对话框n那么,如何以MyArray、MyLink为基础完成一个共同显示函数呢?其实非常简单,先从需要出发,逆向考虑,先写一个泛型显示数,如下所示。templatevoid display(Init start, Init end)cout endl;for(Init mid=start; start != end; mid +)cout *mid t ;cout end;图3-2 Java 2 SDK,SEv1.4.2-Custom Setup对话框n模板参数类型Init是一个指针,start是起始指针,end是结束指针,指针支持+及
5、*操作。display函数与具体的容器无直接关联,间接关联是必须的。对于MyArray来说,Init相当于对T*的操作,对于MyLink来说,相当于对Unit*的操作。因此就引出了迭代器类,它仍然是一个模板类,对于本示例而言,模板参数是T*或Unit *。图3-3 Java2 SDK,SE v1.4.2-Browser Registration对话框nMyArray对应迭代器ArrayIterator类如下所示。templateclass ArrayIteratorInit *init;public:ArrayIterator(Init *init)this-init = init; bool
6、 operator!=(ArrayIterator& it) return this-init != it.init; void operator+(int) init +; Init operator*() return *init; ;n另外,还需要在MyArray类中增加两个函数Begin、End,用以获得起止迭代指针 。T *Begin()/起始迭代指针return m_pData;T *End()/结束迭代指针 return m_pData + m_nValidSize;图3-4 Java2 SDK,SE v1.4.2-Progress对话框n测试函数如下所示。void main()
7、MyArray ary;for(int i=0; i5; i+)ary.Add(i+1);ArrayIterator start(ary.Begin();ArrayIterator end(ary.End();cout 数组元素为: ;display(start, end);图3-5 Java2 SDK,SE v1.4.2-Complete对话框n同理完成链表迭代器类LinkIterator,如下所示。 templateclass LinkIterator Init *init;public: LinkIterator(Init *init) this-init = init; bool op
8、erator != (LinkIterator& it) return this-init != it.init; void operator +(int) init = init-next; Init operator*() return *init; ;n可以看出operator !=、operator*重载内容与ArrayIterator中的内容是相同的,只有operator+中的内容不同,对于链表而言不像数组而言内存是连续的,是指针的转向,因此绝对不能写成init = init+,只能是init = init-next。 图3-6 系统特性对话框n另外,还需要在MyArray类中增加两
9、个函数Begin、End,用以获得起止迭代指针。T *Begin()/起始迭代指针 return m_pData;T *End()/结束迭代指针 return m_pData + m_nValidSize; 图3-7 环境变量对话框 n链表类测试函数如下 所示。void main() int m = 0; MyLink ml; for(int i=0; i5; i+) m = i+1; ml.Add(m); LinkIteratorUnit start(ml.Begin(); LinkIteratorUnit end(ml.End(); display(start, end);3.2 迭代器类
10、位置自定义数组迭代器、链表迭代器的编制方法,迭代器类位于容器之外。但仔细分析能够发现:数组迭代器只能应用于数组容器,不能应用于链表容器;链表迭代器只能应用于链表容器,不能应用于数组容器。也就是说特定的容器应该有特定的迭代器。因此,把迭代器类做为容器的内部类更符合应用的特点,以MyLink为例,融合LinkIterator后代码如下所示。n融合后MyLink代码如下所示。template class MyLinkpublic:struct Unit/链表单元T value;Unit *next;class LinkIteratorUnit *init;public:LinkIterator(Un
11、it *init)this-init = init;bool operator != (LinkIterator& it)return this-init != it.init;void operator +(int)init = init-next;Unit operator*()return *init;n对应的测试代码如下所示。void main() int m = 0; MyLink ml; for(int i=0; i5; i+) m = i+1; ml.Add(m); MyLink:LinkIterator start = obj2.Begin(); MyLink:LinkIter
12、ator end = obj2.End(); display(start, end);3.3进一步理解迭代器 n容器、迭代器、算法关系示意图如下所示。容器类型1容器类型2容器类型n相应迭代器1相应迭代器2相应迭代器n某一具体算法n每个容器都应有对应的迭代器,容器通过迭代器共享某一具体算法,某一具体算法不依附于某一具体的容器。迭代器起到一个中间媒介的作用,通过它把容器与算法关联起来。换一句更贴切的话来说就是:迭代器思维是编制通用泛型算法发展的必然结果,算法通过迭代器来依次访问容器中的元素。图3-11 下载Tomcat5.0.28n也可以得出STL标准模板库编程的基本步骤:形成容器元素; 取出所需
13、要的迭代指针; 调用通用算法。 n其实,在生活中有许多“迭代器”的现象,归根结底是需要“通用”的缘故。比如网上资源是一个通用需求,每个家庭都相当于容器的一个结点,那么通讯设备比如电话线等就相当于迭代器。千家万户通过上网就可以查询所需要的信息。再比如生活中用到的自来水是通用需求,每个家庭仍旧相当于一个结点,那么水管线等就相当于迭代器。 n既然生活中的通用需求促进了各种通讯事业等的发展,那么对于软件中的通用算法而言,也就一定能促进迭代器的不断进步。因此,希望同学们多观察生活现象,因为软件的许多设计思想就在我们的生活周围。如果你能把软件中的每个设计思想都能找到生活中的实例,那么设计软件你就一定能感到
14、非常快乐,不那么枯燥了。 图3-13 接受Tomcat使用协议 nSTL 迭代器共分为5大类型。 (1)输入迭代器 (2)输出迭代器 (3)前向迭代器 (4)双向迭代器 (5)随机迭代器3.4STL迭代器 n输入迭代器 按顺序只读一次。完成的功能有:能进行构造和缺省构造,能被复制或赋值,能进行相等性比较,能进行逐步向前移动,能进行读取值。输入迭代器重载主要操作符 如下所示。操作符说明operate*访问迭代元素值operate+()前置迭代指针+operate+(int)后置迭代指针+operate=迭代元素相等比较operate!=迭代元素不等比较nSTL提供的主要输入迭代器是istream
15、_iterator,支持表3.1中的所有操作,值得注意的是它的构造函数,有两种形式:istream_iterator()默认的构造器,创建了一个流结束的迭代器。istream_iterator(istream &)参数是输入流。含义是从输入流中读数据,当遇到流结束符时停止。 n【例3.2】利用istream_iterator迭代器迭代标准输入流。#include #include using namespace std;int main(int argc, char* argv)cout “请输入数据(如111 222 333,):”;istream_iterator a(cin) ; /建立
16、键盘输入流,用istream_iterator枚举整形数据istream_iterator b; /建立输入流结束迭代器while(1) cout *a 调用operator+(int) if(a = b) /如果当前迭代器等于结束迭代器,则operator= /退出while循环break; 图3-16 设置Tomcat的端口号、用户和密码 n程序执行结果为:请输入数据(如111 222 333,):111 222 333,111222333n输出迭代器只写一次,完成的功能有:能进行构造或缺省构造,能被复制或赋值,能进行相等性比较,能进行逐步前向移动,能进行写入值(*p=x,但不能读出)。输
17、出迭代器重载主要操作符 如下所示。操作符说明operate*分配迭代元素值空间operate=写入元素值operate+()前置迭代指针+operate+(int)后置迭代指针+图3-18 Tomcat安装完成nSTL提供的主要输出迭代器是ostream_iterator,支持表2.2中的所有操作,值得注意的是它的构造函数,有两种形式:ostream_iterator(ostream& out)创建了流输出跌代器, 用来迭代out输出流。ostream_iterator(ostream& out, const char *delim)创建了流输出迭代器, 用来向out输出流输出数据,输出的数据
18、之间用delim字符串分割,也即是每向out输出流输出一个数据后,再向out输出流输出一个分隔符delim。n【例3.3】利用ostream_iterator向屏幕输出数据#include #include using namespace std;int main(int argc, char* argv) cout 输出迭代器演示结果为: ; ostream_iterator myout(cout, t); /创建标准输出迭代器 *myout = 1; myout +; *myout = 2; myout +; *myout = 3; return 0;执行结果为:输出迭代器演示结果为:1 23n前向迭代器 使用 输入迭代器 和输出迭代器可以基本满足算法和容器的要求。但还是有一些算法需要同时具备两者的功能。 STL本身并没有专为前向迭代器预定义的迭代器 。 n双向迭代器: 具有前向
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土方施肥施工方案
- 基于相变材料和液冷的功率模块温控性能研究
- 磁化微咸水膜下滴灌棉田水盐氮协同调控效应及棉花生长模型研究
- 扩张法与Nagata法治疗小耳畸形的疗效对比分析
- 随机非线性系统的事件触发自适应跟踪控制
- 焚烧炉渣-矿渣基地聚物泡沫混凝土的制备及性能研究
- 课题申报书:协同提质背景下县域中小学校本教研实施的路径与对策研究
- 用于光盘精密注塑机企业ESG实践与创新战略研究报告
- 电视机家电企业ESG实践与创新战略研究报告
- 证件摄影服务企业ESG实践与创新战略研究报告
- 湖北省武汉市2025届高中毕业生二月调研考试数学试题及答案
- 医院培训课件:《产前准备-为顺产做准备》
- 《管理学原理》(课件)
- 长城汽车2025人才测评答案
- 幼儿园法制教育讲座
- 河道的管理和防护课件
- 《中华人民共和国产品质量法》知识培训
- 技能人才评价命题技术规程
- 中职不等式的试题及答案
- 深信服aES产品技术白皮书-V1.5
- 浙江省金华义乌市稠州中学2024-2025学年九年级下学期3月独立作业英语试卷(原卷版+解析版)
评论
0/150
提交评论