首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 图书频道 > 计算机与网络 > 程序设计 >

STL扩展技术手册(卷1):集合和迭代器(附光盘1张)

2010-03-05 
基本信息·出版社:机械工业出版社 ·页码:414 页 ·出版日期:2008年09月 ·ISBN:7111242270/9787111242277 ·条形码:9787111242277 ·版本:第1版 · ...
商家名称 信用等级 购买信息 订购本书
STL扩展技术手册(卷1):集合和迭代器(附光盘1张) 去商家看看
STL扩展技术手册(卷1):集合和迭代器(附光盘1张) 去商家看看

 STL扩展技术手册(卷1):集合和迭代器(附光盘1张)


基本信息·出版社:机械工业出版社
·页码:414 页
·出版日期:2008年09月
·ISBN:7111242270/9787111242277
·条形码:9787111242277
·版本:第1版
·装帧:平装
·开本:16
·正文语种:中文
·丛书名:C++设计新思维
·外文书名:Extended STL,Volume1:Collections and Iterators
·图书品牌:华章图书

内容简介 《STL扩展技术手册》以STLSoft为基础,广泛深入地论述了C++标准库STL的相关内容。全书共三部分43章,包括标准库模板、扩展STL、元素引用类别、DRYSPOT原则、抽象泄漏法则、契约式编程、约束、垫片、不完备结构一致性的发端、资源获取、模板工具、推断式接口适配、Henney假说、适配、遍历进程和模块、环境变量、字符串分词、聚集分散的I/O以及迭代器等内容。
全书通过严谨的表述与丰富的示例,将概念和理论与实际的设计和代码结合起来,从而使读者既能深刻地理解STL的知识,又能熟练地掌握STL运用方法。

作者简介 Matthew Wilson Synesis 软件公司的软件开发顾问,STLSoft和Pantheios 库的创建者,《Imperfect C++》(AddisonWesley)的作者,他曾是《C/C++Users Journal》(C/C++用户杂志)的专栏作家,也是一些主要出版物的撰搞者,具有15年以上的C++经验。他拥有英国曼彻斯特大学博士学位,目前定居在澳大利亚。
媒体推荐 “《Extended STL》不只是一本关于适应STL并用于日常工作的书,它也是一次冒险旅行,它带你经历软件设计和概念、C++的强力技术,以及真实世界软件开发中的危险,换句话说,它是一本Matthew Wilson风格的书。如果你对C++的态度是严肃认真的,我认为你应该阅读它。”
—Bjorn Karlsson,主设计师,ReadSoft;《Beyond the C++ Standard Library: An Introduction to Boost》的作者
编辑推荐 著名的C++专家Matthew Wilson在《STL扩展技术手册》中展示了如何超越C++标准并扩展标准模板库(Standard Template Library,STL),进入包含API和非标准集合的更广阔的C++世界,以编写更有效、更有表达力、更灵活、更健壮的软件。
在《STL扩展技术手册》中,Wilson使用自己创新的技术帮助读者掌握STL扩展特性,这体现在两个方面:将专用技术库和操作系统API适配为STL兼容的集合,并定义精密的迭代适配器,使STL潜在的效率和表现力得以实现。Wilson用实际的例子阐明了几个强大的概念和技巧,让你在连STL的创造者都未曾预见的方向上扩展STL,其中包括集合、元素参考类别、外部迭代器失效和推断式接口适配。
对于那些对STL知之甚微的C++程序员,《STL扩展技术手册》将是宝贵的资源。它帮助你:
●学习STL扩展中特有的原则和技巧。
●通过查看STL扩展的内部实现,进一步学习STL。
●学习实现封装的通用技术,在操作系统API和专用技术库之上实现封装。
●学习如何编写迭代器适配器,并理解其实现和使用上的限制及其背后的原理。
《STL扩展技术手册》主要内容包括
●编写大部分集合,并理解它们与容器的不同之处。
●掌握元素引用类别:定义它们,检测它们,并利用它们设计STL扩展集合和迭代器。
●处理外部迭代器失效,并理解它对STL兼容集合的设计产生的惊人影响。
●适配实际的API,包括从文件系统遍历到分散或聚集I/O。
●使用独立迭代器类型,从简单的std::ostream_iterator扩展到复杂的过滤和转换类型或值的适配器。
目录
译者序
前言
致谢
序言
编排体例

第一部分基础
第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总结
结语
参考书目

……
序言 难道每门语言都难免日趋复杂, 并最终绊倒在复杂性的门槛上吗?
—Adam Connor
难用的话, 少用就是了。
—Melanie Krug
事物的两面性
3年前, 《Imperfect C++》快要完工时, 我跟编辑说起这本《Extended STL》, 当时我信心满满地声称它会是一本易读易懂。 且轻薄短小得可以轻松从两个抽象层之间滑过的小册子。 此外我还保证会在半年之内写完。 结果呢?在写这篇序言的时候, 离当初约好的截稿日期已经过去了一年半有余, 而且, 本来计划好的一本薄薄的。 约十六至二十个章节的小册子现在也膨胀成了两卷本, 其中第一卷洋洋洒洒四十三个章节(含“插曲”章节), 哦, 对了, CD上还有三章呢…但话说回来, 当初有一个保证现在仍然可以说是成立的, 那就是这是一本对任何有一定C++经验的读者来说都轻松易懂的书。
为什么这本书后来的情况远远超出我当初的预计呢?并不是因为我是软件工程师——大家都知道软件工程师估计的工作量, 乘三之后才是实际需要的时间。 而是因为(我认为)以下四个重要的原因:
1。STL并不直观, 花费可观的智力投资后方能熟练运用。
2。没错, STL在技术上功臻化境, 没错, STL在内聚性方面超凡入圣。 然而, STL前瞻性不够, 对于在它那有限的概念定义之外的抽象, 它并不能妥善应付。
3。C++语言本身是不完美的。
4。C++是一门难学的语言, 但你得到的回报是效率, 而且同时又并没有牺牲设计。
最近几年C++与时俱进, 这一方面意味着C++变得非常强大, 但另一方面也暴露出了其晦涩难懂的一面。 如果你试着编写一个具有一定规模并用到模板元编程的模板库, 那么一种可能是你将学到许多东西, 并掌握了一个强大的工具, 但同样也很可能的是你编写出的那堆东西除了C++狂热信徒之外谁也无法理解。
C++的使用精神本来就是扩展。 除了很有限的一些应用是将C++看作“更好的C”来使用的之外, 绝大多数C++使用都是围绕着类型定义(类。 枚举。 结构。 联合)来进行的, 而且这些自定义类型很大程度上被做成与内建类型界面一致。 也正因为这个原因, C++中的许多内建操作符都是允许重载的。 这样, 一个vector, 比如说, 便可以重载operator[]来模拟内建数组的界面, 再举个例子:任何可被拷贝(Copyable)的类型(一般)都定义(重载)了拷贝赋值操作符(operator=)。 如此等等, 不一而足。 但由于C++的不完美。 强大。 以及极强的可扩展性, 伴随而来的便是Joel Spolsky所说的抽象渗漏法则(the Law of Leaky Abstractions):“所有非平凡的抽象在某种程度上都是有漏洞的。 ”简单来说这句话就意味着要想顺利使用非平凡的抽象就必须对抽象下面的东西有所了解。
这也正是许多C++开发者重新发明轮子 的原因之一。 其实这里的原因并不仅仅是众所周知的所谓“非我发明症”(NIH) , 而是因为我们常常发现自己所用的第三方组件除了百分之八十的功能是自己能理解并使用的之外, 剩下的百分之二十往往裹着一团晦涩的黑气, 造成后者的原因很多:复杂性。 与既有概念或惯用法的不一致。 低效。 效率。 范围局限性。 设计或实现的不优雅。 糟糕的编码风格等等。 而且, 编译技术现阶段的一些实际问题还会极大地加剧这种情况, 尤其是遇到模板实例化过程中的错误消息时。
我觉得我之所以有资格写这本书, 原因之一就是我花了大量的时间来研究并实现STL相关的库, 而不是接受C++标准(1998)所指定的库或其他人写的库。 而我决定写这本书的原因之一则是想将我在以上过程中学到的东西总结出来。 如果你想要编写STL扩展, 这本书可以为你提供帮助, 而就算你只是想使用其他人写的STL扩展, 这本书也同样有用, 因为抽象渗漏法则决定了你很可能会不时需要掀开抽象这块幕布往里面瞧一瞧。
UNIX编程的原则
在《UNIX程序设计艺术》(Addison-Wesley, 2004)中, Eric Raymond总结了UNIX社群的最佳实践准则, 这些准则来自大量不同的经验。 在我们改装STL的宏大计划中, 这些准则就像标灯一样为我们指明方向:
·清晰原则:清晰比巧妙重要。
·组合原则:设计能够互相连接的组件。
·多样性原则:质疑任何被声称为“真正唯一”的途径。
·经济原则:程序员时间是昂贵的, 在它跟机器时间之间, 优先节省前者。
·可扩展性原则:在未来时态下设计, 因为未来比你想像得来得更快。
·生成原则:避免手动编码, 可以的话, 编写程序来生成程序。
·最小意外原则:在接口设计中作出的决策应该始终是那个令人最少感到意外的选择。
·模块性原则:编写简单的模块, 模块与模块间通过干净的接口连接。
·最大意外原则:如果免不了要失败的话, 要弄出最大动静, 而且失败得越早越好。
·优化原则:首先要能工作, 然后才能谈得上优化。
·Principle of Parsimony: Write large components only when it is clear by demonstration that nothing else will do。
·吝啬原则:除非能够明确证明别无它法, 否则不要编写大的组件。
·健壮性原则:透明性和简单性是健壮性的父母。
·分离原则:策略和机制分离, 接口与引擎分离。
·简单原则:设计应该是简单的, 只在必须的时候才增加或暴露复杂性。
·透明原则:设计的时候应考虑透明性, 以方便检查和调试。

文摘 第2章.扩展STL:STL与真实世界的碰撞
好的定律是清楚和简单的,并让使用者在面对具体问题时应对自如。
-Ron McCallum教授
搞清楚你此刻应当做什么,然后去做。
-Billy Connolly
前章涵盖了STL的要点,包括容器、迭代器、算法、函数对象、分配器及适配器的核心概念。可惜扩展STL时,这些概念不是太抽象就是太粗糙。这一章中我们将针对本卷中关于集合及迭代器适配器的材料,进一步探讨这些概念。
2.1.术语
虽然标准库中包含了许多原STL(Stepanov与同事开发的版本)的内容,但却(还)没有全盘照搬。比方说C++03标准目前只定义了基于树的关联容器,而没有包含原STL中基于hash表的关联容器。尽管已经有建议要加入此类容器,并且会在下个C++标准发布时被采纳,但眼下的状况就是标准库并非STL的超集。
另一方面,标准库中包含不属于STL但却与STL兼容的组件, 即IOStreams。当把IOStreams看作严肃的I/O程序库,无论从哪方面考量,附着其上的STL兼容接口都对C++有利无害。
STL与标准库有许多重叠的地方,但两者却又是不同的。在这一卷中,我不去理会任何未被标准库采纳的STL组件,反之亦然。所以,当我提到“标准组件”的时候,我的意思是指那些既在STL库又在标准库中,且定义与标准库定义一致的组件。
本书主要讨论的是扩展STL的技术,我们还需要一套术语才能进行下去,这些扩展不仅是增加新容器而已。事实上,大部分扩展提供的是对一个区间内的元素的访问手段,但它们根本不是容器,我称它们为STL集合。我们在下一个小节中讨论集合概念,及其与容器概念的关系。
2.2.集合
STL本身只关注容器。标准把容器定义为“存储别的对象,[同时]对这些对象负有分配及回收的责任,途径是对象的构造函数,析构函数,插入操作以及删除操作” (C++-03: 23.1;1)。但是有比容器多得多的类型属于对象集合(图2.1)。在本书所有后续章节,特别是在第二部分中,我将使用在本章中定义的分类。
热点排行