第一部分 模板基础 2
第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.1 HPP文件还是CPP文件 9
1.3.2 链接器如何识别重复模板实例 10
1.4 尴尬的Export Template 13
1.4.1 什么是外名模板 13
1.4.2 C++编译器对外名模板的处理 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<bool>说起 40
4.2 特例的多种写法 44
4.3 特例匹配规则 46
4.4 函数模板的特例与重载 47
4.4.1 分辨重载 50
4.4.2 编译期的条件判断逻辑 52
4.5 本章小结 54
第二部分 标准库中的模板 56
第5章 容器、迭代器与算法 56
5.1 容器的定义 56
5.2 容器的实现 56
5.2.1 Java的实现方法 57
5.2.2 C++的实现方法 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.1 foreach的三种写法 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
第三部分 模板编程高级技巧 180
第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.2 D语言的方法 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.1 hetero node的启发 224
12.4.2 编译期递归 225
12.4.3 访问元组中的数据 227
12.5 本章小结 230
第13章 元编程 231
13.1 C++中的元编程 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++ 246
第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