C++模板编程领域的经典著作,由资深C++开发工程师撰写,以透彻分析原理为前提,深入讲解了模板编程的基本原理、标准库中算法与容器等模板的实现原理;本书以实践为导向,通过大量的模板向读者展示了如何使用模板进行编程以及如何编写自定义模板。除此之外,本书还总结了各种常用的模板编程技巧、C++11新标准中的模板新特性和新语法,以及C++11中新增的其他语言特性。
全书共16章,分为四部分:第一部分(1~4章)首先介绍了模板编程的基本概念与用法,然后重点讨论了编译器对模板的具体实现方法及其局限,读者可以通过本部分内容理解模板的基本原理并自行实现简单的类模板与函数模板;第二部分(第5~9章)对标准库中的算法与容器的实现原理和用法进行了深入地剖析,读者可以通过本部分内容对标准库中的算法、迭代器与容器之间的关系有深入的理解,从而可以精确调节标准容器的行为以及自行开发适用于标准算法的容器类模板;第三部分(10~13章)讨论了模板编程的高级技巧,如模板编程中“概念”的设计、控制代码量的技术、编译期逻辑的控制以及元编程的基本方法等,读者可以通过本部分内容开发更具规模、更加智能的模板库,并利用元编程技术实现编译期的逻辑演绎与类型推导;第四部分(14~16章)介绍了C++11新标准中的新增语言特性,以及对模板编程的影响。
封面图
目录
- 前言
- 第一部分模板基础
- 第1章Hello模板 / 2
- 1.1为什么需要模板 / 2
- 1.2初识函数模板 / 3
- 1.2.1函数模板的实现 / 3
- 1.2.2如何使用函数模板 / 4
- 1.2.3模板参数自动推导 / 5
- 1.2.4模板参数默认值 / 7
- 1.2.5模板函数的静态变量 / 8
- 1.3如何处理函数模板中的函数体 / 8
- 1.3.1HPP文件还是CPP文件 / 9
- 1.3.2链接器如何识别重复模板实例 / 10
- 1.4尴尬的Export Template / 13
- 1.4.1什么是外名模板 / 13
- 1.4.2C++编译器对外名模板的处理 / 14
- 1.5本章小结 / 15
- 第2章类亦模板 / 16
- 2.1类型无关的数据结构 / 16
- 2.2实践——栈类模板 / 17
- 2.2.1栈类模板实例 / 17
- 2.2.2栈类模板衍生子类模板实例 / 20
- 2.3突破——异质链表 / 21
- 2.4构造元组 / 23
- 2.4.1通过嵌套实现元组 / 23
- 2.4.2用类实现元组 / 24
- 2.5类模板的用法 / 25
- 2.5.1成员函数模板 / 25
- 2.5.2友元函数模板 / 26
- 2.6类模板的静态成员 / 27
- 2.7本章小结 / 30
- 第3章模板参数类型详解 / 31
- 3.1整数模板参数 / 31
- 3.2函数指针模板参数 / 32
- 3.3指针及引用模板参数 / 34
- 3.4成员函数指针模板参数 / 35
- 3.5模板型模板参数 / 37
- 3.6本章小结 / 39
- 第4章凡事总有“特例” / 40
-
4.1从vector
说起 / 40 -
4.2特例的多种写法 / 44 -
4.3特例匹配规则 / 46 -
4.4函数模板的特例与重载 / 47 -
4.4.1分辨重载 / 50 -
4.4.2编译期的条件判断逻辑 / 52 -
4.5本章小结 / 54 -
第二部分标准库中的模板 -
第5章容器、迭代器与算法 / 56 -
5.1容器的定义 / 56 -
5.2容器的实现 / 56 -
5.2.1Java的实现方法 / 57 -
5.2.2C++的实现方法 / 60 -
5.3容器与迭代器 / 62 -
5.3.1链表容器与迭代器 / 64 -
5.3.2集合容器与迭代器 / 67 -
5.4迭代器与算法 / 71 -
5.4.1求容器中元素之和 / 71 -
5.4.2实例:微型算法库 / 73 -
5.5容器与迭代器的分类 / 75 -
5.6容器与算法的关系 / 76 -
5.7迭代器的陷阱 / 76 -
5.8本章小结 / 77 -
第6章标准库中的容器 / 79 -
6.1容器的分类及基本要求 / 79 -
6.2序列型容器 / 81 -
6.2.1变长数组vector / 82 -
6.2.2双向链表list / 84 -
6.2.3双端序列deque / 85 -
6.3容器转换器 / 87 -
6.3.1栈stack与队列queue / 87 -
6.3.2优先队列priority_queue / 88 -
6.4关联型容器 / 89 -
6.4.1基本数据结构 / 89 -
6.4.2内嵌类型定义 / 92 -
6.4.3构造关联型容器 / 92 -
6.4.4插入数据 / 93 -
6.4.5数据的删除、查找与访问 / 96 -
6.4.6整数值专用集合bitset / 98 -
6.5散列表容器 / 99 -
6.5.1基本数据结构 / 99 -
6.5.2散列函数 / 100 -
6.5.3桶 / 101 -
6.6其他C++11新容器 / 104 -
6.6.1定长数组array / 104 -
6.6.2单向链表forward_list / 105 -
6.7本章小结 / 106 -
第7章隐形的助手——分配器 / 107 -
7.1分配器的基本要求 / 107 -
7.2交换容器内容时的特殊处理 / 110 -
7.3有态分配器与无态分配器 / 112 -
7.4实践:池分配器 / 114 -
7.4.1池分配器模板类的设计 / 115 -
7.4.2对象池的实现 / 116 -
7.4.3定位构造 / 121 -
7.4.4池分配器的实现 / 122 -
7.4.5测试池分配器 / 127 -
7.4.6实际运行 / 129 -
7.5本章小结 / 131 -
第8章标准库中的迭代器 / 132 -
8.1迭代器分类 / 132 -
8.1.1输入迭代器 / 132 -
8.1.2前向迭代器 / 133 -
8.1.3双向迭代器与跳转迭代器 / 135 -
8.1.4输出迭代器 / 136 -
8.2迭代器属性类模板 / 137 -
8.3迭代器转换器 / 139 -
8.3.1反转迭代器 / 139 -
8.3.2插入迭代器 / 141 -
8.4流迭代器 / 142 -
8.5本章小结 / 144 -
第9章标准库中的算法 / 145 -
9.1算法的共同特征 / 145 -
9.2标准库中的常用算法 / 145 -
9.2.1foreach的三种写法 / 146 -
9.2.2搜索 / 147 -
9.2.3计数与比较 / 149 -
9.2.4复制、交换、替换与删除 / 149 -
9.2.5排序 / 151 -
9.2.6二分搜索 / 151 -
9.2.7集合运算 / 152 -
9.2.8二叉堆操作 / 154 -
9.2.9其他算法 / 154 -
9.3预设函数对象 / 155 -
9.3.1函数对象基类 / 155 -
9.3.2运算函数对象 / 156 -
9.3.3参数绑定 / 157 -
9.4实践:矩阵操作中如何消除循环语句 / 165 -
9.4.1跨跃迭代器 / 165 -
9.4.2矩阵类模板 / 167 -
9.4.3累计迭代器 / 169 -
9.4.4矩阵乘法 / 170 -
9.4.5矩阵LU分解 / 171 -
9.4.6组合迭代器 / 172 -
9.4.7没有循环语句的矩阵乘法 / 177 -
9.5本章小结 / 178 -
第三部分模板编程高级技巧 -
第10章专用名词——概念 / 180 -
10.1模板的先天不足 / 180 -
10.2“概念”的提案及ConceptGCC编译器 / 181 -
10.3概念语法 / 183 -
10.3.1定义概念 / 183 -
10.3.2用概念约束模板参数 / 184 -
10.3.3概念映射 / 184 -
10.4概念模拟库 / 186 -
10.4.1概念检查宏 / 187 -
10.4.2自定义概念检查 / 189 -
10.4.3概念典型 / 190 -
10.5本章小结 / 191 -
第11章代码膨胀 / 192 -
11.1源代码的增加 / 192 -
11.1.1代理类的困境 / 192 -
11.1.2D语言的方法 / 195 -
11.2目标代码的增加 / 196 -
11.2.1目标代码膨胀的成因 / 196 -
11.2.2目标代码膨胀实例 / 197 -
11.2.3改进代码 / 198 -
11.2.4测试改进效果 / 206 -
11.3本章小结 / 208 -
第12章常用模板编程技巧 / 209 -
12.1标签与特性 / 209 -
12.1.1特性类模板numeric_limits / 209 -
12.1.2实例:矩阵与向量乘法 / 211 -
12.2编译期多态 / 213 -
12.2.1全覆盖的函数模板 / 213 -
12.2.2虚函数的启发 / 213 -
12.2.3虚基类模板 / 214 -
12.3策略 / 217 -
12.3.1策略的产生:再说vector的不足 / 217 -
12.3.2为vector添加存储策略 / 218 -
12.4伪变长参数模板 / 223 -
12.4.1hetero_node的启发 / 224 -
12.4.2编译期递归 / 225 -
12.4.3访问元组中的数据 / 227 -
12.5本章小结 / 230 -
第13章元编程 / 231 -
13.1C++中的元编程 / 231 -
13.2元函数 / 231 -
13.2.1元函数的实现 / 231 -
13.2.2元函数的调用 / 233 -
13.3元容器与元算法 / 235 -
13.3.1元容器的实现 / 235 -
13.3.2实例:容纳5种类型的元容器 / 236 -
13.4类型过滤 / 240 -
13.4.1类型过滤元函数的实现 / 240 -
13.4.2实例:应用元容器与元算法 / 242 -
13.5本章小结 / 244 -
第四部分模板与C++11 -
第14章右值引用 / 246 -
14.1右值引用的产生 / 246 -
14.1.1函数的匿名返回值 / 246 -
14.1.2返回值优化 / 249 -
14.2右值引用基本概念 / 251 -
14.2.1左值与非左值 / 251 -
14.2.2右值与右值引用 / 252 -
14.2.3移动构造与移动赋值 / 252 -
14.2.4狭义与广义的右值 / 253 -
14.2.5左值强制转义成右值引用 / 254 -
14.2.6右值引用变量是左值 / 255 -
14.3引用声明符消去规则 / 256 -
14.3.1完美转发 / 256 -
14.3.2实例:智能的min函数 / 260 -
14.4移动与异常 / 263 -
14.4.1迁移数据的风险 / 263 -
14.4.2关键字noexcept / 265 -
14.4.3转义函数模板 / 267 -
14.4.4移动的效率问题 / 268 -
14.5本章小结 / 269 -
第15章模板新语法 / 270 -
15.1变长参数模板 / 270 -
15.1.1参数包 / 271 -
15.1.2参数包的内容 / 272 -
15.1.3参数包的展开模式 / 273 -
15.1.4遍历参数包的内容 / 274 -
15.1.5轻松实现元组 / 275 -
15.2扩展的类型推导机制 / 276 -
15.2.1自动类型变量 / 277 -
15.2.2提取表达式结果类型 / 278 -
15.2.3函数后置返回类型 / 280 -
15.3其他模板新特性 / 281 -
15.3.1外部模板实例 / 281 -
15.3.2模板别名 / 282 -
15.3.3连续的右尖括号 / 282 -
15.4本章小结 / 283 -
第16章C++11新特性集锦 / 284 -
16.1λ表达式 / 284 -
16.1.1λ表达式语法 / 284 -
16.1.2变量捕获 / 285 -
16.2初值列表新用法 / 290 -
16.2.1构造变量 / 290 -
16.2.2初值封装类模板 / 291 -
16.3标准容器与算法的变化 / 292 -
16.3.1对应右值引用 / 292 -
16.3.2对应变长参数模板 / 293 -
16.3.3对应初值列表 / 294 -
16.4标准元组类模板 / 294 -
16.5智能指针 / 296 -
16.5.1独占指针unique_ptr / 297 -
16.5.2共享指针shared_ptr与weak_ptr / 298 -
16.6基于范围的for循环 / 299 -
16.7拾遗 / 300 -
16.8本章小结 / 301