关于迭代器详细说明.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于迭代器详细说明

关于迭代器的详细说明 迭代器是什么? 我们先从一个例子说起: int a[10], *p; for (p = a[0]; p != a[10], ++p) std::cout *p std::endl; 在上述for语句构成的迭代操作中,指针p首先指向了数组a的首元素,然后通过++运算和!=运算来完成迭代。这里,指针p“知道”它指向了一片连续的存储区,所以++运算就有意义了。 这里,指针p可以视为一个最为简单的迭代器。程序员可以通过该“迭代器”方便灵活地访问容器(即a数组)。 当然,这里所说的容器(a数组)过于简单。对于更复杂的情况,迭代器被定义为一个某种容器类的伴随类,一般定义在容器类的内部,具有public属性,是其包围容器类的友元。它可以在容器类的外部使用。 在多数情况下,迭代器内部有一个内部普通指针,它可以指向容器类的内部存储机构。而迭代器类本身模拟了一个指针的行为,为此它重载了用于指针操作的三个关键运算符: != ++ * 为了使用迭代器,其包围容器类提供了两个public成员: begin(),它返回一个迭代器对象,并使该对象的内部指针指向了容器对象的存储结构的首元素; end(),它返回一个“空”迭代器对象,该对象的内部指针指往往是个nullptr。而在一般情况下,容器对象的内部存储结构都用nullptr标识存储的结尾,所以可以说,空迭代器对象的内部指针指向了存储结构中最后一个元素的“后”一个元素。这个迭代器对象往往称为“哨兵”。注意:空迭代器仅仅参与了比较运算(及两个迭代器内部指针的比较运算),而没有引用该迭代器对象“指向的对象”,因此在使用上是安全的。 为什么需要迭代器 对于内部结构相对复杂的容器,我们不能使用指针直接指向其内部存储结构去访问它,因为这样直接破坏了数据封装的原则。 因此,一个折中的方法是为容器类设计一个遍历成员traverse(),它带有一个谓词函数作为参数去访问每一个容器元素。 然而,这虽然实现了数据封装,却是遍历这类的迭代操作变得很不灵活,因为程序员可能不得不编写多种谓词函数去处理不同的情况。 迭代器的引入可以彻底解决上述种种不便。迭代器模拟了一个指针的行为,配合容器提供的begin()和end(),程序员可以像使用指针那样去使用迭代器, 而不需要直到容器的内部结构,也不需要编写太多的谓词函数,从而起到两全其美的效果。 如何定义迭代器 例如,对于教材上使用链式存储的容器类List,其迭代器的定义如下: class list { public: typedef int _elemType; //元素的类型 private: struct _NODE_ //链表的节点。这个用于存储的类型定义在private段中,因为类的外部无法获悉其存储结构的详情 { _elemType data; _NODE_* next; } _head; typedef _NODE_* _NODEPTR_; public: typedef _NODEPTR_ _range; //_range是_NODE_*的别名 //省略了其它容器成员 friend class iterator; //因为该迭代器类要访问List类的私有类型_NODE和其内部数据 class iterator { private: _range _p; //迭代器的内部指针 public: iterator(range = nullptr) : _p(range) {} iterator operator++() { _p = _p-next; //内部指针指向下一个节点。根据容器类存储结构的不同,该语句也不尽相同 return *this; } bool operator!=(const iterator i) { return _p != i._p; //两个指针的比较,判断两个指针是否指向了同一个节点 } _elemType operator*() { return _p-data; } iterator operator=(const iterator i) { _p = i._p; return *this; } }; iterat

文档评论(0)

ktj823 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档