首页>参考读物>计算机科学与技术>软件与程序设计

STL扩展技术手册卷I:集合和迭代器
作者 : Matthew Wilson
译者 : 金庆 宋晨光 郑逾洋 吴圳
丛书名 : C++设计新思维
出版日期 : 2008-09-18
ISBN : 7-111-24227-7
定价 : 65.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 416
开本 : 16开
原书名 : Extended STL,Volume1:Collections and Iterators
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

“这不只是一本关于掌握STL并用于日常工作的书,也是一次冒险旅行,它带你经历软件设计和概念、C++中的技巧,以及实际软件开发中的危险。如果你对C++的态度是严肃认真的,那么你就应该阅读它。”
  ——Bj?rn Karlsson,ReadSoft公司资深架构师;
  《Beyond the C++ Standard Library:An Introduction to Boost》的作者

  著名的C++专家Matthew Wilson在本书中展示了如何超越C++标准并扩展标准模板库(Standard Template Library,STL),进入包含API和非标准集合的更广阔的C++世界,以编写更有效、更有表达力、更灵活、更健壮的软件。
在本书中,Wilson使用自己创新的技术帮助读者掌握STL扩展特性,这体现在两个方面:将专用技术库和操作系统API适配为STL兼容的集合,并定义精密的迭代适配器,使STL潜在的效率和表现力得以实现。Wilson用实际的例子阐明了几个强大的概念和技巧,让你在连STL的创造者都未曾预见的方向上扩展STL,其中包括集合、元素参考类别、外部迭代器失效和推断式接口适配。

对于那些对STL知之甚微的C++程序员,本书将是宝贵的资源。它帮助你:
  ●学习STL扩展中特有的原则和技巧。
  ●通过查看STL扩展的内部实现,进一步学习STL。
  ●学习实现封装的通用技术,在操作系统API和专用技术库之上实现封装。
  ●学习如何编写迭代器适配器,并理解其实现和使用上的限制及其背后的原理。

  编写大部分集合,并理解它们与容器的不同之处。
  ●掌握元素引用类别:定义它们,检测它们,并利用它们设计STL扩展集合和迭代器。
  ●处理外部迭代器失效,并理解它对STL兼容集合的设计产生的惊人影响。
  ●适配实际的API,包括从文件系统遍历到分散或聚集I/O。
  ●使用独立迭代器类型,从简单的std::ostream_iterator扩展到复杂的过滤和转换类型或值的适配器。

 附赠光盘包含大量由作者创建的开源代码库,同时还包括一些测试项目和3篇文章。

图书特色

图书前言

我的伯父John,是那种我父母一代所谓的男子汉。他强壮、粗犷、有点吓人,很有牛仔气概,而且他有勇气承认自己害怕,不像我只愿意述说自己的小失败。所以,当他说第二次跳伞的挑战是克服已知的恐惧,我记住了。我现在已经写了两本书,可以毫无疑问地证实这种相同的恐惧。开始第二次时,你知道有多少痛苦即将来临,这不是件能轻易做到的事。那么问题是,为什么我还这样做呢?
  其原因将在序言中阐述,总的来说,我试图对以下看似简单的两面性做出回应:
C++太复杂了。
C++是惟一足够强大,能满足我需要的语言。
这种两面性最突出的一个领域是,使用和扩展标准模板库(Standard Template Library,STL),尤其是扩展。本书(及其姊妹篇,卷2),是我在过去10年左右的时间内,为解决这一挑战性课题而积累的知识和经验的精华。
目标
本书描述了一个使用和扩展STL的好办法。书中定义了以下内容:
集合的概念,以及它和容器概念的区别
元素引用类别的概念,包括它的重要性如何,如何定义,如何检测,及其施加在STL扩展集合和迭代器设计之上的妥协
外部迭代器失效的现象,及其令人惊讶的行为对STL兼容集合设计的影响
一个能探测任意集合特性的机制,不论该集合是否提供变动性操作
书中说明了几个问题:
为什么变换迭代器适配器必须按值返回元素
为什么过滤迭代器必须总是输入一对迭代器来进行操纵
如果在迭代中,底层集合有改动,该怎么办
为什么你应该禁止输出迭代器类中无意义的语法,以及如何利用解引用代理模式做到这点
书中展示了以下方法:
将批量返回元素的API适配到STL集合概念
将逐个返回元素的API适配到STL集合概念
共享枚举状态,以正确实现输入迭代器概念的需求
枚举可能是无限的集合
为特定迭代器类型特化标准算法,以优化性能
为系统环境变量定义一个安全,平台独立的STL扩展,通过全局变量实现
适配一个集合,其迭代器实例的可拷贝性要在运行时才能决定
提供对可逆但不可重复集合的访问
利用迭代器写字符缓冲区
本书会解决这些以及更多问题。它还着眼于如何构建通用的,STL兼容的软件库,同时不牺牲健壮性,灵活性,特别是,性能。本书教你如何制作抽象蛋糕,用效率的奶油裱花,然后吃了它。
通过阅读这本书,可以有如下收获:
学习STL扩展中特殊的原则和技巧
查看STL扩展的实现,来学习更多关于STL的知识
学习实现封装的通用技术,在操作系统API和专用技术库之上实现封装
学习如何编写迭代器适配器,并理解其实现和使用上的限制,及其背后的原因
获得通用软件库性能优化的技术
在STL扩展中使用经过考验的软件组件
关于主题
我相信,你必须写你所知道的东西。因为本书的主要目的,是传授对STL扩展的过程和问题的认识,所以大部分讨论的材料来自于我的工作,即我自己的(开源的)STLSoft库。由于我是从零开始,实现了STLSoft几乎所有的功能,因此,它是使我说话有权威性的最佳材料。当我们讨论设计上的错误时,这一点尤其重要,公开地详细评述他人的设计错误,不太可能取得许多积极成果。
但是,这并不意味着,阅读本书会迫使您使用STLSoft,或者,其他软件库的追随者不能在此学到任何合乎他们惯例的东西。事实上,本书不会劝诱人们使用任何特殊的软件库,它所展现的材料是让你从里到外查看STL扩展,重点是STL的原则和扩展的实践,而不是依赖于STLSoft或任何其他软件库的现有知识。如果当你读完这本书,你仍然不想使用STLSoft库,没关系,只要你学到了有用的知识,知道如何实现和使用其他STL扩展即可。
在示范STL扩展的方法时,我不自诩我所使用的方式是最好的。C++是一种非常强大的语言,支持多种风格和技巧,以至于有时候反而会不利。举例来说,许多集合,但不是全部,最好实现为STL集合,而有些则是用独立的迭代器表示会更好。其中有相当多的重叠,需要忍受许多模棱两可的表达。
对于大多数讨论的STL扩展,我让读者(在某些情况下还有作者!)参加一个旅行,从原始的API,先实现初步的封装,但这往往是有缺陷的,然后达成一个最优的,或者至少是最理想的版本。我不回避实现上和概念上的复杂性。事实上,为了将外部API塑造成STL的形式,某些技术必须包含一定程度的技巧。我不会为了叙述简单,假装这些东西在实现中不存在,或对它们不作任何解释。我将涵盖这些东西,并在这样做时,希望能够做到两点:(1)揭示它们的一些复杂性,(2)解释它们为什么是必要的。
理解STL最好的方式之一,是学习如何实现STL组件,而学习如何实现STL组件,最好的方式是实现它们。如果你没有时间(或爱好)去实现STL组件,我建议你使用第二个最好的方式,就是阅读本书。
本书结构
本书分为三大部分。
第一部分:基础
这一部分是一些篇幅较小的章,为第二和第三部分讨论的材料提供基础。它首先简要回顾STL的主要特点,随后讨论了有关STL扩展的概念和原则,包括一个新概念的介绍,即元素引用类别。下面几章考虑基础性的概念、机制、范式和原则:一致性、约束、契约、DRY SPOT、RAII、垫片。余下几章涉及模板工具和技术,包括特征类,和推断式接口适配,以及在第二和第三部分讨论的实现中用到的几个关键组件。
第二部分:集合
这部分是本书的主体。每一章涉及一个或多个相关的真实世界中的集合和集合的适配,使之成为一个STL扩展集合组件,同时还有适当的迭代器类型。主题上,适配的对象种类繁多,如:文件系统枚举、COM枚举器、非STL的容器、分散/聚集I/O,甚至还有元素受外部更改的集合。涉及的问题包括:迭代器类别选择和元素引用类别的概念、状态分享、可变性和外部迭代器失效。
第三部分:迭代器
第二部分中的内容包含与集合关联的迭代器类型的定义,而第三部分是专门针对独立的迭代器类型的。涉及的主题范围从定制输出迭代器类型(包括对std∷ostream_iterator功能的简单扩展的讨论),到复杂的迭代器适配器(可以对它们所应用的底层区间,进行类型和值的过滤和转换)。
第2卷
第2卷尚未完成,其结构也尚未最后确定,但将包含如下内容:函数、算法、适配器、分配器,以及STL扩展概念:区间和视图。
补充材料
光盘
本书所附光盘包含各种免费软件库(包括所有文中涉及的库)、测试程序、工具和其他有用的软件。还包括三个完整的但未经编辑的章节(这三章没有印刷出来,是为了减少篇幅,或是为了避免太多的编译器相关性),还有许多来自其他章节的注解和小节。
在线资源
补充材料也可从网上下载:http://extendedstlcom/ 。

封底文字

“这不只是一本关于掌握STL并用于日常工作的书,也是一次冒险旅行,它带你经历软件设计和概念、C++中的技巧,以及实际软件开发中的危险。如果你对C++的态度是严肃认真的,那么你就应该阅读它。”
  ——Bj?rn Karlsson,ReadSoft公司资深架构师;
  《Beyond the C++ Standard Library:An Introduction to Boost》的作者

  著名的C++专家Matthew Wilson在本书中展示了如何超越C++标准并扩展标准模板库(Standard Template Library,STL),进入包含API和非标准集合的更广阔的C++世界,以编写更有效、更有表达力、更灵活、更健壮的软件。
在本书中,Wilson使用自己创新的技术帮助读者掌握STL扩展特性,这体现在两个方面:将专用技术库和操作系统API适配为STL兼容的集合,并定义精密的迭代适配器,使STL潜在的效率和表现力得以实现。Wilson用实际的例子阐明了几个强大的概念和技巧,让你在连STL的创造者都未曾预见的方向上扩展STL,其中包括集合、元素参考类别、外部迭代器失效和推断式接口适配。

对于那些对STL知之甚微的C++程序员,本书将是宝贵的资源。它帮助你:
  ●学习STL扩展中特有的原则和技巧。
  ●通过查看STL扩展的内部实现,进一步学习STL。
  ●学习实现封装的通用技术,在操作系统API和专用技术库之上实现封装。
  ●学习如何编写迭代器适配器,并理解其实现和使用上的限制及其背后的原理。

  编写大部分集合,并理解它们与容器的不同之处。
  ●掌握元素引用类别:定义它们,检测它们,并利用它们设计STL扩展集合和迭代器。
  ●处理外部迭代器失效,并理解它对STL兼容集合的设计产生的惊人影响。
  ●适配实际的API,包括从文件系统遍历到分散或聚集I/O。
  ●使用独立迭代器类型,从简单的std::ostream_iterator扩展到复杂的过滤和转换类型或值的适配器。

 附赠光盘包含大量由作者创建的开源代码库,同时还包括一些测试项目和3篇文章。

作者简介

Matthew Wilson:Matthew Wilson: Synesis软件公司的软件开发顾问,STLSoft和Pantheios库的创建者,《Imperfect C++》(Addison-Wesley)的作者。他曾是《C/C++ Users Journal》(C/C++用户杂志)的专栏作家,也是一些主要出版物的撰稿者,具有15年以上的C++经验。他拥有英国曼彻斯特大学博士学位,目前定居在澳大利亚。

译者简介

金庆 宋晨光 郑逾洋 吴圳:暂无简介

译者序

自从1998年9月C++标准定案以来,STL就作为标准库的重要组成部分,为广大程序员所熟知,也确实带来了巨大的便利。但作为一种兼顾系统编程和应用编程的语言,C++绝不可能局限于STL的象牙塔之中。只要面对的任务稍具现实性,我们就不可避免地要和所谓“遗产”API(应用程序接口)打交道。
  这些编程接口在过去若干年中积累而来,固然堪称宝贵财富,但有时候也会成为C++编程的沉重负担。
使用方式让人隐约感到暗合STL的概念,“集合”、“迭代”、“迭代器”的影子似乎触手可及,甚至就是另一种容器实现,但由于缺少所需的编译时接口,无法直接搭配STL算法和适配器。
  经常采取显式资源管理,其传统的“分配—使用—释放”三部曲,在C++异常大行其道的今天,显得非常脆弱,往往给程序种下慢性病的病根——资源泄露。
几乎每个C++程序员都会面对以上问题。在形形色色的解决方案中,Matthew Wilson编写的STLSoft库可算是个中翘楚,其中包含大量适配代码,让这些传统API摇身一变,不仅可以方便地搭配STL使用,同时具备了异常安全性,让客户代码简洁、清晰、透明到令人吃惊的程度。STLSoft正是Matthew Wilson写作本书的基础,他在书中包含了十余个STLSoft组件,不厌其烦地讲解实现思路和方法,对比直接使用API和使用适配组件的代码,以极其直观的方式让读者体会到二者之间的差异。
  熊掌有了,那么鱼呢?性能可算是每个C++程序员心中挥之不去的情结。放心,Matthew Wilson对此绝无含糊其辞、蒙混过关的企图,相反,他始终将组件的运行性能列为重要的设计目标。书中大多数组件都附有实实在在的性能基准数据,清楚地表明“抽象”和“高效”并非不可兼得。
  一部容量如此巨大的著作,如果全是罗列组件,讲解实现,未免显得匠气十足。而作者的过人之处在于一边埋头苦干,一边抬头看路,他将STLSoft实现代码背后的理念、观点、感悟也和盘托出。所以书中不仅随处散落着各种“提示”、“规则”、短小精悍的“插曲”,作者还以正式的篇幅讲解STL概念及扩展、元素引用类别、抽象泄露法则、鹅规则和鸭规则,讲解之后,又在书中频繁运用,让人很容易将抽象的概念、理论和实际的设计、代码相联系。十余个组件的设计固然精妙,其背后的思维方式尤其深刻,但看过这本书之后,能够以合理的方式在既有数据、算法之上抽象出STL扩展容器,或者深刻认识STL的概念、方法,为运用STL打下坚实的基础,才算是读者最重要的收获。
  人生苦短。我们是否愿意在编写冗长繁复的代码之后,为更新、维护绞尽脑汁,或者在设计漏洞百出的资源管理机制后,为解决时隐时现的bug殚精竭虑;还是为一本好书全心投入,从此和简洁、高效、安全的代码结缘?答案不言而喻。


  译者
  2008年3月

图书目录

译者序
前言
致谢
序言
编排体例


第一部分基础
第1章标准模板库
11核心概念
12容器
121序列容器
122关联容器
123存储空间的连续性
124交换
13迭代器
131输入迭代器
132输出迭代器
133前向迭代器
134双向迭代器
135随机访问迭代器
136成员选取运算符
137预定义的迭代器适配器
14算法
15函数对象
16分配器
第2章扩展STL:STL与真实世界的
碰撞
21术语
22集合
23迭代器
231可变性
232遍历
233在编译期决定特性
234元素引用类别
235共享状态信息和独立状态
信息
236需要修改迭代器精化的分类吗
第3章元素引用类别
31介绍
32C++引用
33元素引用类别的分类法
331持久引用
332固定引用
333可失效引用
334瞬时引用
335按值临时引用
336空引用
34使用元素引用类别
341在编译时检测引用类别
342使用编译器帮助避免迭代器
未定义行为
35定义operator->()
36元素引用类别:尾声
第4章奇异去临时引用
第5章DRY SPOT原则
51C++编程中符合DRY SPOT的
做法
511常量
512dimensionof()
513创建函数
52C++编程中不太符合DRY SPOT
的做法
521父类
522函数返回类型
53封闭的名字空间
第6章抽象泄漏法则
第7章契约式编程
71强制的类型
72强制的机制
第8章约束
81利用C++类型系统
82静态断言
第9章垫片
91介绍
92主要的垫片
921属性垫片
922转换垫片
93复合垫片
第10章鸭规则和鹅规则:不完备结
构一致性的发端
101一致性
1011类型一致性
1012结构一致性
1013鸭规则和鹅规则
102显式语义一致性
1021概念
1022给成员类型打标签
1023垫片
103交集一致性
第11章资源获取即初始化
111资源可变性
112资源来源
第12章模板工具
121特征类
1211base_type_traits
1212sign_traits
1213类型的特性:迷你特征
1214is_integral_type
1215is_signed_type
1216is_fundamental_type
1217is_same_type
122类型生成器
123真正的typedef
第13章推断式接口适配:编译时适配
接口不全的类型
131介绍
132适配接口不全的类型
133适配非变动性集合
134推断式接口适配
1341类型选择
1342类型检测
1343类型修正
135把IIA应用于区间
第14章Henney假说:当模板参数表
太长
第15章通过equal()减少友元函数
的使用
151警惕非成员友元函数的滥用
152集合及其迭代器
第16章基本组件
ⅩⅩⅢ161介绍
162auto_buffer
1621它不是容器
1622类接口
1623复制
1624分配器宜最后
1625swap()
1626性能
163filesystem_traits
1631成员类型
1632通用字符串处理
1633文件系统名字处理
1634文件系统状态操作
1635文件系统控制操作
1636返回类型和错误处理
164file_path_buffer
1641basic_
1642UNIX和PATH_MAX
1643Windows和MAX_PATH
1644缓冲区的使用
165scoped_handle
166dl_call()
第二部分集合
第17章适配glob API
171简介
1711动机
1712glob API
172解析使用原始API的版本
173unixstl∷glob_sequence
1731公有接口
1732成员类型
1733成员变量
1734标志
1735构造
1736glob_sequence元素个数和
元素访问
1737迭代
1738init_glob_()
174解析使用glob_sequence实现的
版本
175小结
第18章插曲:构造函数冲突以及
不良的设计
第19章适配opendir/readdir API
191介绍
ⅩⅩⅣ1911动机
1912opendir/readdir API
192分析直接使用API的代码
193unixstl∷readdir_sequence
1931成员类型和成员常量
1932构造
1933元素迭代和集合大小相关的
方法
1934提取属性的方法
1935const_iterator,版本1
1936使用版本1
1937const_iterator,版本2:复制
语义
1938operator++()
1939迭代器类别和可适配的成员
类型
19310operator ->()
19311支持fullPath和absolutePath
标志
194其他的实现方法
1941把迭代结果保存为快照
1942把迭代结果保存为迭代器
195总结
第20章适配FindFirstFile/
FindNextFile API
201介绍
2011动机
2012FindFistFile/FindNextFile API
202对例子的分解
2021冗长版本
2022精简版本
2023重解析点和无限递归
203basic_findfile_sequence的设计
204winstl∷basic_findfile_sequence
2041类的接口
2042构造
2043迭代
2044如果编译器不支持异常
205winstl∷basic_findfile_sequence_const_
iterator
2051构造
2052find_first_file_()
2053operator ++()
206winstl∷basic_findfile_sequence_
value_type
207垫片
208basic_findfile_sequence为什么不用垫
片和构造函数模板
209小结
2010结尾:用recls进行文件系统遍历…
第21章插曲:枚举FTP服务器目录——
保持效率和可用性的平衡
211inetstl∷basic_findfile_sequence
212inetstl∷basic_ftpdir_sequence
第22章遍历进程和模块
221集合的特征
222winstl∷pid_sequence
2221基于组合的简单实现
2222获取进程ID
2223没有异常支持时的工作方式
223winstl∷process_module_sequence
224枚举一个系统中的所有模块
225排除系统伪进程
226处理缺失API头文件的情况
227总结
第23章斐波那契序列
231简介
232斐波那契序列
233STL序列表示的斐波那契数列
2331无限序列的接口
2332为序列添加契约
2333换用别的值类型
2334对值类型进行约束
2335抛出std∷overflow_error
234可发现性的欠缺
235定义有限上界
2351最终还是要用迭代器
2352由构造函数限定的区间
2353True_Typedefs
236小结
第24章适配MFC的CArray容器族…
241介绍
242动机
243模拟std∷vector
244设计时的考虑
2441MFC的数组容器族
2442CArray_traits
2443数组适配器类的设计
2444以抽象方式操纵状态
2445CopyandSwap惯用法
2446编写集合的接口
2447教学方法
245mfcstl∷CArray_adaptor_base
的接口
246mfcstl∷CArray_cadaptor
2461模板声明和继承
2462应用CRTP
2463CArray_cadaptor的构造
2464operator[]()
247mfcstl∷CArray_iadaptor
248CArray_adaptor_base的构造
249内存分配器
2410元素访问方法
2411元素迭代
24111begin()和end()
24112rbegin()和rend()
2412和容器大小相关的方法
2413容器容量相关的方法
2414比较相关的方法
2415修改容器结构的方法
24151push_back()
24152assign()
24153pop_back()和clear()
24154erase()
24155insert()
2416赋值和swap()
2417总结
2418在CD上
第25章环境变量的map
251介绍
252动机
253getenv()、putenv()、setenv()/
unsetenv()和environ
254platformstl∷enviroment_variable_
traits
255规划接口
256通过名字查找
2561选择1:返回固定/瞬时引用,
指向一个缓存对象,具有
最新值
2562选择2:返回固定引用,指向一
个缓存对象,具有快照值
2563选择3:返回固定引用,指向一
个缓存对象,具有最新值
2564选择4:返回按值临时引用,具有
最新值
ⅩⅩⅤ2565通过名字查找:尾声
257通过名字插入、更新和删除值
258迭代
2581第1版:连续迭代器
2582第2版:双向迭代器
2583第3版:快照
2584第4版:引用计数的快照
259最终的迭代实现
2591可变的快照
2592创建快照
2593const_iterator嵌套类
2594insert()方法
2595erase()方法
2596operator []()和lookup()
2597snapshot嵌套类
2510异质的引用类别
2511size()和下标索引
2512总结
2513在CD上
第26章在Z平面上来回穿梭
261序言
262介绍
263第1版:前向迭代
2631zorder_iterator,第1版
2632window_peer_sequence,
第1版
264第2版:双向迭代
265处理外部更改
266winstl∷child_window_sequence
267双向迭代器的蓝调音乐
2671end()标记的陷阱
2672致命的双重解引用
2673当双向迭代器不是前向迭代器,
而是可逆可复制迭代器
268winstl∷zorder_iterator:自身的
反转
2681zorder_iterator特征类
2682zorder_iterator_tmpl<>
2683反向的语义
269同级窗口序列的定稿
2610总结
2611Z平面:尾声
第27章字符串分词
ⅩⅩⅥ271介绍
272strtok()
273SynesisSTL∷StringTokeniser
274字符串分词的用例
275字符串分词的其他选择
2751strtok_r()
2752IOStreams
2753stlsoft∷find_next_token()
2754boost∷tokenizer
276stlsoft∷string_tokeniser
2761stlsoft∷string_tokeniser∷const_
iterator
2762确定迭代器类别和元素
引用类别
2763stlsoft∷string_tokeniser
_type_traits
2764stlsoft∷string_tokeniser
_comparator
277测试代码
2771以单个字符作为分隔符
2772字符串作为分隔符
2773保留空白字段
2774复制还是引用:考虑使用“字符
串视图”(String View)
2775字符集作为分隔符
278愚蠢的策略类
2781经由继承重构模板参数
2782类型生成器模板
2783关于Henney假说
279性能
2710总结
第28章适配COM枚举器
281介绍
282动机
2821冗长版
2822短小版
283COM枚举器
2831IEnumXXXX∷Next()
2832IEnumXXXX∷Skip()
2833IEnumXXXX∷Reset()
2834IEnumXXXX∷Clone()
2835枚举器的各种值类型
284分解冗长版
285comstl∷enumerator_sequence
2851enumerator_sequence的
公共接口
2852成员类型及成员常量
2853值策略(Value Policies)
2854成员变量
2855构造函数
2856迭代方法
2857迭代器方法的const限定是
错误的
2858破坏了值语义
286comstl∷enumerator_sequence∷
iterator
2861构造
2862迭代方法
2863equal()
287comstl∷enumerator_sequence∷iterator∷
enumeration_context
2871为什么需要枚举上下文
2872类定义
2873构造
2874迭代器的支持方法
2875不变量
288迭代器复制策略
2881comstl∷input_cloning_policy…
2882comstl∷forward_cloning
_policy
2883comstl∷cloneable_cloning
_policy
289选择默认的复制策略:应用最小意外
原则
2810总结
28101为什么不默认使用前向
迭代器
28102为什么不默认使用输入
迭代器
28103为什么不把Q固定为1
28104为什么不使用标准容器
2811后文提要
第29章插曲:运用成员类型推断,
纠正设计上的小疏忽
第30章适配COM集合
301介绍
302动机
3021冗长版
3022简洁版
303comstl∷collection_sequence
3031公有接口
3032成员类型和常量
3033构造
3034迭代:干净地利用一个肮脏的
把戏
3035size()
304枚举器获取策略
305总结
第31章聚集分散的I/O
311介绍
312分散/聚集 I/O
313分散/聚集I/O API
3131以COM流实现线性化
3132Platformstl∷scatter_slice_
sequence-预告
314适配ACE_Message_Queue
3141acestl∷message_queue_sequence,
版本1
3142acestl∷message_queue_sequence∷
iterator
315吃蛋糕时间
3151再快些
3152acestl∷message_queue_sequence,
版本2
3153特化标准库
3154性能
316总结
第32章根据参数返回不同类型
321介绍
322向Ruby借颗宝石
323C++中的双语义下标
324通过字符串访问垫片扩大兼容性
325整数的美中不足
326选择返回类型和重载
327总结
第33章外部迭代器失效
331元素接口一致性
332Windows的ListBox和ComboBox
控件
3321提取元素的竞争条件
3322WinSTL中的listbox_sequence和
combobox_sequence类
333枚举注册表键和值
3331那问题在哪
3332WinSTL注册表库
3333处理外部迭代器失效问题
3334winstl∷basic_reg_key_
sequence
334总结
335在CD上
第三部分迭代器
第34章增强版ostream_iterator
341介绍
342std∷ostream_iterator
343stlsoft∷ostream_iterator
3431垫片的应用
3432安全语义
3433stlsoft∷ostream_iterator与std∷
ostream_iterator的兼容性
3434违反了设计原则吗
344定义流插入运算符
ⅩⅩⅦ345小结
第35章插曲:借助解引用代理模式,消
除笨拙的输出迭代器语法
第36章变换迭代器
361介绍
362动机
3621使用std∷transform()
的版本
3622使用变换迭代器的版本
363定义迭代器适配器
3631创建函数
3632值类型
364stlsoft∷transform_iterator
3641第一个版本
3642构造
3643自增、自减运算符和指针
算术方法
3644比较运算符和算术运算符
3645问题在于
3646第二个版本
3647stlsoft∷transform_iterator
365复合变换
366违反了DRY SPOT原则
3661使用类型别名和非临时
函数对象
3662使用异质迭代器和算法
3663接受现实,但小心谨慎
367没准Sequence能帮上点忙
368小结
369CD上的内容
第37章插曲:命名时谨慎为好
第38章成员选取迭代器
381介绍
382动机
383stlsoft∷member_selector_iterator
384创建函数的悲哀
3841以非变动性方式访问非常量
数组
3842以非变动性方式访问常量
数组
3843以变动性方式访问非常量
数组
3844通过迭代器类,以非变动性
方式访问非常量集合
3845通过迭代器类,以非变动性
方式访问常量集合
3846通过迭代器类,以变动性方式
访问集合
3847选取常量成员
ⅩⅩⅧ385总结
386在CD上
第39章连接C风格字符串
391动机
392不灵活的版本
393stlsoft∷cstring_concatenator_
iterator
394创建函数
395总结
396CD上的内容
第40章字符串对象的连接操作
401简介402stlsoft∷string_concatenator_iterator
403异质字符串类型的良好协作
404但是
4041关于可赋值性
4042悬空引用
4043解决方案
405小结
第41章适配迭代器特征类
411Introduction
412stlsoft∷adapted_iterator_traits
4121iterator_category
4122value_type
4123difference_type
4124pointer
4125reference
4126const_pointer和const_reference…
4127effective_reference和effective_
const_reference
4128effective_pointer和effective_const
_pointer
4129使用这个特征类
413小结
414CD上的内容
第42章过滤迭代
421介绍
422无效版
423用成员迭代器定义区间
424那么
425stlsoft∷filter_iterator
4251前向迭代器语义
4252双向迭代器语义
4253随机访问迭代器语义
426限制迭代器的类别
427总结
428在CD上
第43章组合多个迭代器适配
431介绍
432转换筛选后的迭代器
433筛选转换后的迭代器
434两边下注
435总结
结语
参考书目

教学资源推荐
作者: (美)Al Kelley,Ira Pohl
作者: Richard C. Detmer
作者: Alfred V. Aho;Monica S.Lam;Ravi Sethi;Jeffrey D. Ullman
作者: [美]埃里克 S. 罗伯茨(Eric S. Roberts) 著
参考读物推荐