网站大量收购独家精品文档,联系QQ:2885784924

有效使用Iterator的三条基本原则.doc

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

Effective STL 不需要看Amazon上的读者打分,也不需要去找C++专家们的书评。单是似曾相识的封面,似曾相识的书名,还有似曾相识的作者,就足以证明它不会让你失望了。 这是Scott Meyers的第三本C++专著,在以其特有的简练而敏锐的笔锋揭示了如何有效使用C++语言本身的种种规则之后,Scott将注意力转移到了C++标准库中的STL部分。 Effective STL的各章节不同程度的涉及STL的六大构成要件。千万不要误以为这是一本STL使用手册或者初学者指南,与这一系列的前两本一脉相承,Effective STL同样是为具备一定STL使用经验的程序员准备的。 提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。使用STL可以使你的代码更为优雅且易于维护,可以让你彻底的从C语言风格中解脱出来。然而,STL秉承了C++的设计风格:高效甚至正确性仍然依赖于程序员的正确抉择。如何正确使用STL(尤其是当性能问题至关重要的时候),对广大C++程序员来说仍是一种挑战。 也许你的C++代码已经充斥着vector、string甚至multimap,也许你正在为此而自鸣得意,然而,你是否真的了解STL呢?你知道如何在各种容器类之间做出正确的选择吗?你知道如何最为有效的从一个vector中删除特定值的元素吗?你知道关联容器中“等值”与“等价”的区别吗?先别急着回答,Scott会让你后悔的,我保证。 有些书是每个C++程序员都必须拥有的,Effective STL正是其中的一本。 —— Thomas Becker, C/C++ Users Journal专栏作家 以下文章(有效使用STL迭代器的三条基本原则)是C/C++ Users Journal摘录的Effective STL的三个独立条款。你可以在找到英文原文。 关于Scott的前两本C++专著:Effective C++和More Effective C++,可以参见侯捷先生的书评:掷地铿锵的三本OOP小书。 有效使用STL迭代器的三条基本原则 STL迭代器的概念看上去似乎已经足够直观了,然而,你会很快发现容器类(Container)实际上提供了四种不同的迭代器类型:iterator、const_iterator、reverse_iterator和const_reverse_iterator。进而,你会注意到容器类的insert和erase方法仅接受这四种类型中的一种作为参数。问题来了:为什么需要四种不同的迭代器呢?它们之间存在何种联系?它们是否可以相互转换?是否可以在STL算法(Algorithm)和其他工具函数中混合使用不同类型的迭代器? 这些迭代器与相应的容器类及其方法之间又是什么关系? 这篇从新近出版的《Effective STL》中摘录的文章将会通过迭代器使用的三条基本原则来回答上述问题,它们能够帮助你更为有效的使用STL迭代器。 原则一:尽量使用iterator取代const_iterator、reverse_iterator和const_reverse_iterator STL中的所有标准容器类都提供四种不同的迭代器类型。对于容器类containerT而言,iterator的功用相当于T*,而const_iterator则相当于const T*(可能你也见到过T const *这样的写法,它们具有相同的语义[2])。累加一个iterator或者const 如图所示,你可以隐式的将iterator转换成const_iterator或者reverse_iterator,也可以隐式的将reverse_iterator转换成const_reverse_iterator。并且,reverse_iterator可以通过调用其base()成员函数转换为iterator。const_reverse_iterator也可以类似的通过base()转换成为const_iterator。然而,一个图中无法显示的事实是:通过base()得到的也许并非你所期待的iterator,我们将会在原则三中详细讨论这一点。 很显然,我们没有办法从一个const_iterator转换得到一个iterator,也无法从const_reverse_iterator得到reverse_iterator。这一点非常重要,因为这意味着当你仅仅得到一个const_iterator或者const_reverse_iterator,你会在调用容器类的一些成员函数时遇到麻烦。这些成员函数要求iterator作为参数,而你无法从const类型的迭代器中直接得到iterator。当需要指出插入或者删除的位置时,const类型的迭代器总是显得那么力不从

文档评论(0)

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

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

1亿VIP精品文档

相关文档