
| 编写大部分的集合,并理解它们与容器的不同之处 掌握元素参考类别:定义它们,检测它们,并利用它们设计STL扩展集合和迭代器 与外部迭代器失效一起工作,并理解它对STL兼容集合的设计产生的令人惊讶的影响 适配现实世界的API,包括从文件系统遍历到分散/聚集I/O 使用独立迭代器类型,从简单的std::ostream_iterator扩展到复杂的过滤和转换类型或值的适配器 |
| Matthew Wilson,Synesis软件公司的软件开发顾问,STLSoft和Pantheios库的创建者,《Imperfect C++》(Addison-Wesley)的作者。他曾是《C/C++ Users Journal》(C/C++用户杂志)的专栏作家,也是一些主要出版物的撰稿者,具有15年以上的C++经验。他拥有英国曼彻斯特大学博士学位,目前定居在澳大利亚。 .. << 查看详细 |
| 译者序. 前言 致谢 序言 编排体例 第一部分基础 第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.5copyandswap惯用法 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总结 结语 参考书目... |
商品评论(0条)