目录
目录
译者序
前言
致谢
序言
编排体例
第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.2.1.可变性
2.3.迭代器
2.3.1.可变性
2.3.2.遍历
2.3.3.在编译期决定特性
2.3.4.元素引用类别
2.3.5.共享状态信息和独立状态信息
1.3.1节)。在标准库中这方面唯一的例子是istream_iterator和
2.3.6.需要修改迭代器精化的分类么
第3章.元素引用类别
3.1介绍
3.2.C++(www.cppentry.com)引用
3.2.1.STL容器中的元素引用
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章.奇异去临时引用
第五章DRYSPOT原则
5.1C++(www.cppentry.com)编程(www.cppentry.com)中符合DRYSPOT的做法
5.1.1常量
5.1.2.dimensionof()
5.1.3.创建函数
5.2.C++(www.cppentry.com)编程(www.cppentry.com)中不太符合DRYSPOT的做法
5.2.1.父类
5.2.2.函数返回类型
5.3.封闭的名字空间
第6章抽象泄漏法则
第7章契约式编程(www.cppentry.com)
7.1.强制的类型
7.2.强制的机制
第8章.约束
8.1.利用C++(www.cppentry.com)类型系统
8.1中:
8.2.静态断言
第9章.垫片
9.1.介绍
9.2.主要的垫片
9.2.1.属性垫片
9.2.2.转换垫片
9.3.复合垫片
9.3.1.字符串访问垫片
第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.1资源可变性
11.2资源来源
第12章模板工具
12.1.特征类
12.1.1.base_type_traits
12.1.2.sign_traits
12.1.3.类型的特性:迷你特征
12.1.4.is_integral_type
12.1.5.is_signed_type
12.1.6.is_fundamental_type
第13章。
12.1.7.is_same_type
12.2.类型生成器
12.2.1.stlsoft::allocator_selector
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.2.auto_buffer
16.2.1.它不是容器!
16.2.2.类接口
16.2.3.拷贝
16.2.4.分配器宜最后
16.2.5.swap()
16.2.6.性能
16.3.filesystem_traits
16.3.1.成员类型
16.3.2.通用字符串处理
16.3.3.文件系统名字处理
16.3.4.文件系统状态操作
16.3.5.文件系统控制操作
16.3.6.返回类型和错误处理
16.4.file_path_buffer
16.4.1.basic_
16.4.2.UNIX和PATH_MAX
16.4.3Windows和MAX_PATH
16.4.4.缓冲区的使用
16.5.scoped_handle
16.6.dl_call()
第二部分集合
第17章适配globAPI
17.1简介
17.1.1动机
4.0)
17.2globAPI
17.2解析使用原始API的版本
17.3.unixstl::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.8.init_glob_()
17.13。
17.4.解析使用glob_sequence实现的版本
17.5小结
第18章插曲:构造函数冲突以及不良的设计——即
第19章.适配opendir/readdirAPI
19.1.介绍
19.1.1.动机
7.1)
19.1.2.opendir/readdirAPI
19.2.分析直接使用API的代码
19.3.unixstl::readdir_sequence
19.3.1.成员类型和成员常量
19.3.2.构造
19.3.3.元素迭代和集合大小相关的方法
19.3.4.提取属性的方法
19.3.5.const_iterator,版本1
19.7所示。
19.3.6.使用版本1
19.3.7.const_iterator,版本2:拷贝语义
19.3.8.operator++()
19.3.9.迭代器类别和可适配的成员类型
19.3.10.operator->()
19.3.11.支持fullPath和absolutePath标志
19.16所示。
19.4.其它的实现方法
19.4.1.把迭代结果保存为快照
19.4.2.把迭代结果保存为迭代器
19.5.总结
第20章适配FindFirstFile/FindNextFileAPI
20.1介绍
20.1.1动机
20.1.2FindFistFile/FindNextFileAPI
20.2对例子的分解
20.2.1冗长版本
20.2.2精简版本
20.2.3重解析点和无限递归
20.3basic_findfile_sequence的设计
20.4.winstl::basic_findfile_sequence
20.4.1类的接口
20.4.2构造
20.4.3迭代
20.4.4如果编译器不支持异常
20.11中给出。
20.5.1构造
20.5.3小节中将对此进行详细解释。
20.5.2.find_first_file_()
20.5.3.operator++()
20.23,该清单中还列出了其中四个方法的实现。
20.7垫片
20.9小结
20.10结尾:用recls进行文件系统遍历
第21章.插曲:枚举FTP服务器目录——保持效率
21.1.inetstl::basic_findfile_sequence
21.2.inetstl::basic_ftpdir_sequence
第22章遍历进程和模块
22.1.集合的特征
22.2.winstl::pid_sequence
22.2.1.基于组合的简单实现
22.2.2.获取进程ID
22.2.3.没有异常支持时的工作方式
22.3.winstl::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.4.4对值类型进行约束
23.3.5抛出std::overflow_error?
23.4可发现性的欠缺
23.5定义有限上界
23.5.1最终还是要用迭代器?
23.5.2由构造函数限定的区间
23.5.3.True_Typedefs
23.6小结
第24章.适配MFC的CArray容器族
24.1.介绍
24.2.动机
24.3.模拟std::vector
24.4.设计时的考虑
24.4.1.MFC的数组容器族
24.4.2.CArray_traits
24.6)。尽管这些容器缺少定义良好的公共成员类型,但是谢天谢地,它们的结
24.4.3.数组适配器类的设计
24.4.4.以抽象方式操纵状态
24.4.5.Copy-and-Swap惯用法
24.4.6.编写集合的接口
24.4.7.教学方法
24.5.mfcstl::CArray_adaptor_base的接口
24.6.mfcstl::CArray_cadaptor
24.6.1.模板声明和继承
24.6.2.应用CRTP
24.6.3.CArray_cadaptor的构造
24.6.4.operator[]()
24.7.mfcstl::CArray_iadaptor
24.8.CArray_adaptor_base的构造
24.9.内存分配器
24.10.元素访问方法
24.11.元素迭代
24.11.1.begin()和end()
24.11.2.rbegin()和rend()
24.12.和容器大小相关的方法
24.12.1.内存分配优化
24.13.容器容量相关的方法
24.14.比较相关的方法
24.22所示的比较方法。
24.15.修改容器结构的方法
24.15.1.push_back()
24.15.2.assign()
24.15.3.pop_back()和clear()
24.15.4.erase()
24.32所示。
24.15.5.insert()
24.16.赋值和swap()
24.16.1.swap()
24.17.总结
24.18.在CD上
第25章环境变量的map
25.1.介绍
25.2.动机
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.3.const_iterator嵌套类
25.9.4.insert()方法
25.9.5.erase()方法
25.9.6.operator[]()和lookup()
25.9.7.snapshot嵌套类
25.10.异质的引用类别?
25.11.size()和下标索引
25.12.总结
25.13.在CD上
26.1.序言
26.2.介绍
26.3.第1版:前向迭代
26.3.1.zorder_iterator,第1版
26.3.2.window_peer_sequence,第1版
26.4.第2版:双向迭代
26.5.处理外部更改
26.6.winstl::child_window_sequence
26.7.双向迭代器的蓝调音乐
26.7.1.end()标记的陷阱
26.7.2.致命的双重解引用
26.7.3.当双向迭代器不是前向迭代器,而是可逆可复制迭代器
26.8.winstl::zorder_iterator:自身的反转
26.8.1.zorder_iterator特征类
26.12显示了这两个特征类必需的前向声明和
26.8.2.zorder_iterator_tmpl<>
26.8.3.反向的语义
26.9.同级窗口序列的定稿
26.10.总结
26.11.Z平面:尾声
第27章.字符串分词
27.1.介绍
27.2.strtok()
27.3.SynesisSTL::StringTokeniser
27.4.字符串分词的用例
27.5.字符串分词的其它选择
27.5.1.strtok_r()
27.5.2.IOStreams
27.5.3.stlsoft::find_next_token()
27.5.4.boost::tokenizer
27.6.stlsoft::string_tokeniser
27.6.2.确定迭代器类别和元素引用类别
27.7.测试代码
27.7.1.以单个字符作为分隔符
27.7.2.字符串作为分隔符
27.7.3.保留空白字段
27.7.4.拷贝还是引用:考虑使用“字符串视图”(StringView)
27.7.4.1.s=view,v=view
27.7.4.2.s=string,v=view
27.7.4.3.s=view,v=string
27.7.4.4.s=string,v=string
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.3.COM枚举器
28.3.1.IEnumXXXX::Next()
28.3.2.IEnumXXXX::Skip()
28.3.3.IEnumXXXX::Reset()
28.3.4.IEnumXXXX::Clone()
28.3.5.枚举器的各种值类型
28.4.分解冗长版
28.5.comstl::enumerator_sequence
28.5.1.enumerator_sequence的公共接口
28.5.2.成员类型及成员常量
28.5.3.值策略(ValuePolicies)
28.5.4.成员变量
28.5.5构造函数
28.5.6.迭代方法
28.5.7.迭代器方法的const限定是错误的?
28.5.8.破坏了值语义
28.6.1.构造
28.6.2.迭代方法
28.6.3.equal()
28.7.1.为什么需要枚举上下文
28.7.2.类定义
28.7.3.构造
28.16列出了拷贝构造函数,它需要一个枚举器接口的指针和被拷贝实例指针作
28.17)。该函数的调用位置在迭代器类的转换构造函数中,而后者由迭代器序
28.18)。注意,在不变量测试的周围有局部增减操作,这是为了避免该测试检
28.7.4.迭代器的支持方法
28.7.5.不变量
28.8.迭代器拷贝策略
28.8.1.comstl::input_cloning_policy
28.8.2.comstl::forward_cloning_policy
28.9.选择默认的拷贝策略:应用最小意外原则
28.9.1.empty()
28.10.总结
28.10.1.为什么不默认使用前向迭代器
28.10.2.为什么不默认使用输入迭代器
28.10.3.为什么不把Q固定为1?
28.10.4.为什么不使用标准容器
28.11.后文提要
第29章插曲:运用成员类型推断,纠正设计上的小
13.4.1节),这主要和编译器是否支持模板偏特化有关。因为标准要求这种支
第30章适配COM集合
30.1.介绍
30.2.动机
30.2.1.冗长版
30.2.2.简洁版
30.3.comstl::collection_sequence
30.3.1.公有接口
30.3.2.成员类型和常量
30.4节讨论。(如果你喜欢提问式教学,你可以先设想一下这个策略类型会有
30.3.3.构造
30.3.4.迭代:干净地利用一个肮脏的把戏
30.3.5.size()?
30.4.枚举器获取策略
30.5.总结
第31章聚集分散的I/O
31.1.介绍
31.2.分散/聚集I/O
31.3.分散/聚集I/OAPI
31.3.1.以COM流实现线性化
31.4.适配ACE_Message_Queue
31.5所示(简洁起见,省去错误处理)。
31.5.吃蛋糕时间
31.5.1.再快些!
31.5.3.特化标准库
31.5.4.性能
31.6.总结
32.1.介绍
32.2.向Ruby借颗宝石
32.3.C++(www.cppentry.com)中的双语义下标
32.4.通过字符串访问垫片扩大兼容性
32.5.整数的美中不足
32.6.选择返回类型和重载
32.6.1.禁止有符号数作为下标索引
32.7.总结
第33章外部迭代器失效
33.1.元素接口一致性
23.2.4.3)。相反,在以下代码中,只有b会失效:
33.2.Windows的ListBox和ComboBox控件
33.2.1.提取元素的竞争条件
33.3.枚举注册表键和值
33.3.1.那问题在哪
33.3.2.WinSTL注册表库
33.1所示。
33.3.3.处理外部迭代器失效问题
33.3.4.winstl::basic_reg_key_sequence
33.4.总结
33.5.在CD上
第三部分:迭代器
34.1介绍
34.2.std::ostream_iterator
34.2.1.将difference_type定义为void
34.3.stlsoft::ostream_iterator
34.3.1垫片的应用
34.3.2安全语义
34.3.4违反了设计原则吗?
34.4定义流插入运算符
34.5小结
第35章插曲:借助解引用代理模式,消除笨拙的输
第36章变换迭代器
36.1介绍
36.2动机
36.2.1使用std::transform()的版本
36.2.2使用变换迭代器的版本
36.5列出的完全手写算法的版本。
8.45
3.4
36.2所示。不过这种情况下,手工编写代码的版本,性能普遍比使用
3.4
36.3定义迭代器适配器
36.3.1创建函数
36.3.2值类型
36.4.stlsoft::transform_iterator
36.4.1第一个版本
36.4.2构造
36.4.3自增、自减运算符和指针算术方法
36.4.4比较运算符和算数运算符
36.4.5问题在于……
36.4.6第二个版本
36.4.7.stlsoft::transform_iterator
36.5复合变换
36.6违反了DRYSPOT原则?
36.6.1使用类型别名和非临时函数对象
36.6.2使用异质迭代器和算法
36.6.3接受现实,但小心谨慎
36.7没准Sequence能帮上点忙?
36.8小结
36.9CD上的内容
第37章插曲:命名时谨慎为好
第38章.成员选取迭代器
38.1.介绍
38.2.动机
38.2.1.std::accumulate()
7.1
38.3.stlsoft::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.4.创建函数
39.5.总结
39.6.CD上的内容
第40章字符串对象的连接操作
40.1简介
40.3.异质字符串类型的良好协作
40.4但是……
40.4.1关于可赋值性
40.4.2悬空引用
40.4.3解决方案
40.5小结
第41章适配迭代器特征类
41.1.Introduction
41.2.stlsoft::adapted_iterator_traits
41.2.1.iterator_category
41.2.2.value_type
41.2.3.difference_type
41.2.4.pointer
41.2.5.reference
41.2.9使用这个特征类
41.3小结
41.4CD上的内容
第42章过滤迭代
42.1.介绍
42.2.无效版
42.3.用成员迭代器定义区间
42.4.那么……?
42.5.stlsoft::filter_iterator
42.5.1.前向迭代器语义
42.5.2.双向迭代器语义
42.5.3.随机访问迭代器语义
42.6.限制迭代器的类别
42.7.总结
42.8.在CD上
第43章.组合多个迭代器适配
43.1.介绍
43.2.转换筛选后的迭代器
43.2.1.创建函数
43.3.筛选转换后的迭代器
43.4.两边下注
43.5.总结
【责任编辑:
董书 TEL:(010)68476606】