基本介紹
- 書名:實戰系列:深入實踐C++模板編程
- 出版社:機械工業出版社
- 頁數:316頁
- 開本:16
- 品牌:機械工業出版社
- 作者:溫宇傑
- 出版日期:2013年6月1日
- 語種:簡體中文
- ISBN:7111427548, 9787111427544
基本介紹,內容簡介,作者簡介,圖書目錄,序言,
基本介紹
內容簡介
C++模板編程領域經典著作,深入講解模板編程的基本原理、標準庫中算法與容器等模板的實現原理、模板編程的高級技巧,以及C++11的模板新特性
資深C++開發工程師撰寫,以透徹分析原理為前提,以實踐為導向,能有效指導讀者動手編寫各類模板
資深C++開發工程師撰寫,以透徹分析原理為前提,以實踐為導向,能有效指導讀者動手編寫各類模板
作者簡介
溫宇傑 資深C++軟體工程師,有多年C++開發經驗,對C++模板編程和元編程有非常深入的研究,實踐經驗十分豐富。擅長組合最佳化算法及大規模積體電路輔助設計算法,對FPGA體系結構以及Verilog和VHDL等硬體描述語言也有非常深入的研究,曾主持並參與開發了一套完整設計流程的FPGA平台編譯軟體。
圖書目錄
目 錄
前言
第一部分 模板基礎
第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 說起 / 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.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
第三部分 模板編程高級技巧
第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++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
前言
第一部分 模板基礎
第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 說起 / 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.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
第三部分 模板編程高級技巧
第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++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
序言
前 言
為什麼要寫這本書
筆者在工作中最常用的程式語言就是C++。在最初接觸C++語言的時候,只當它是C語言與面向對象編程的組合,在寫代碼時也是積極實踐“萬物皆對象”的法則,不管什麼操作,總要將其在某個對象的某個成員函式中實現才滿意。但在長年的編程實踐過程中,卻常常對面向對象的設計方法產生懷疑。
面向對象的設計思想,是將與某個數據類型相關的操作與該數據類型捆綁在一起,構成一個整體。然而,有時候操作並不完全依賴於數據類型。同一種算法,可能適用於不同的數據類型。如果硬要遵循“萬物皆對象”的法則,那么只能將其在各個具體數據類型中重複實現,或是設計一個抽象的類型專門容納算法。無論怎樣,總顯得有些“削足適履”。
而在實踐中最苦惱的事情是,雖然算法固定,但是只因數據結構不同,每當引入新數據時,只得將算法重寫一遍,徒費人工。高手看到此,自然就會想到將算法寫成模板。也正因有此困擾,筆者才開始正視C++語言中的“模板編程”,一旦走入這套精密強力卻又不廣為人知的機制,方知此處別有洞天。
幾番研究與實踐下來,筆者尚不敢稱對C++的模板編程掌握幾分,卻早已嘆於其對筆者編程思路革新起到巨大的幫助。從“萬物皆對象”,到如今漸漸變為關注設計容器及抽象算法,這是拜模板所賜。讚嘆之餘,不禁想嘗試寫一本書介紹C++中的模板編程,於人分享心得,於己則鞏固琢磨。不論章節條理,只求娓娓道來。如能對讀者略有裨益,便是幸甚。
讀者對象
本書假定讀者對C++的語法有基本了解,要求僅此而已。筆者盡力將C++語言中這一部分非常有趣的內容,用詳盡的示例以及平實的語言展現在讀者面前。即使是剛剛踏入C++隊伍的新兵,相信也能跟隨本書的進度,漸漸領略這一片C++秘境。而對於久經沙場的老兵,筆者限於自身閱歷有限,不敢誇口定能有所提高,唯有以誠意將所思所得寫下,請諸位老兵“擇其善者從之,其不善者改之”。
本書面向了解C++基本語法並有C++編程經歷的讀者。對C++模板編程技術、標準模板庫用法和原理感興趣的讀者,可以將本書作為一本入門與提高的書使用。對於經常開發中小型C++代碼庫的讀者,本書中有關模板高級編程技巧的內容可為您提供有益的補充。另外,本書中有關C++11新標準與模板技術的內容,也可作為對新標準的概要介紹供您參考。
如何閱讀本書
本書的內容分為四個部分。
模板基礎(第1~4章)介紹模板編程的基本概念與用法,並著重討論編譯器對模板的具體實現方法及其局限。學習完本部分之後,讀者可以理解模板的基本原理並自行實現簡單的類模板與函式模板。
標準庫中的模板(第5~9章)介紹標準庫中的算法與容器,並對其實現細節進行仔細推敲。算法與容器可以說是C++模板編程的最典型用法。C++程式設計師可以不知道模板編程技術,但不可能不用到由模板寫成的標準算法與容器。了解其實現原理的重要意義不言而喻。學習完本部分,讀者將能洞悉標準庫容器的實現原理,對標準庫中的算法、疊代器與容器之間的關係有深入的理解,從而可以精確調節標準容器的行為以及自行開發適用於標準算法的容器類模板等。
模板編程高級技巧(第10~13章)討論模板編程中“概念”的設計、控制代碼量的技術、編譯期邏輯的控制以及元編程的基本方法等。學習完本部分,讀者可以開發規模更大、更加智慧型的模板庫,並利用元編程技術實現編譯期的邏輯演繹與類型推導。
模板與C++11(第14~16章)介紹新標準C++11中的重要改進及其對模板編程的影響。在學習完本部分之後,讀者將能夠準確把握C++11的幾大重要革新的用意和用法,為利用新一代標準進行軟體開發打下堅實基礎。
勘誤和支持
除封面署名外,本書編寫工作的還有:陳凱、石少華、劉宏業、林文雯、王春、張敏、付強。由於筆者學識與經歷有限,書中內容難免有偏頗及謬誤之處。筆者將秉持謙虛的態度和開放的胸襟,認真對待各位讀者的批評與指教。書中的全部源檔案可以從華章網站下載,如您對本書內容有任何意見和建議,或者有關C++和程式設計的任何話題,歡迎傳送郵件至[email protected]和通過新浪微博@宇傑W與筆者交流。
致謝
感謝我的好友張哲君。作為本書草稿的第一位讀者,你的意見與鼓勵是我寫作本書的動力之源。
感謝機械工業出版社華章公司的各位同仁為本書的出版付出的辛勤勞動。特別要感謝楊福川編輯和白宇編輯,本書從草稿到成書的過程,離不開你們的精心指導與耐心審校。
最深深的謝意送給我的母親和我的妻子。沒有你們在我身邊一直默默地支持和付出,不會有提筆寫作的我,也不會有本書存在。
最美好的祝願送給我即將出生的孩子們。願你們快樂成長,並擁有淡定從容的人生。
最後,藉此機會,向C++語言的發明者BjarneStroustrup教授、標準模板庫的主要作者Alexander Stepanov和Meng Lee致以崇高的敬意。
溫宇傑
為什麼要寫這本書
筆者在工作中最常用的程式語言就是C++。在最初接觸C++語言的時候,只當它是C語言與面向對象編程的組合,在寫代碼時也是積極實踐“萬物皆對象”的法則,不管什麼操作,總要將其在某個對象的某個成員函式中實現才滿意。但在長年的編程實踐過程中,卻常常對面向對象的設計方法產生懷疑。
面向對象的設計思想,是將與某個數據類型相關的操作與該數據類型捆綁在一起,構成一個整體。然而,有時候操作並不完全依賴於數據類型。同一種算法,可能適用於不同的數據類型。如果硬要遵循“萬物皆對象”的法則,那么只能將其在各個具體數據類型中重複實現,或是設計一個抽象的類型專門容納算法。無論怎樣,總顯得有些“削足適履”。
而在實踐中最苦惱的事情是,雖然算法固定,但是只因數據結構不同,每當引入新數據時,只得將算法重寫一遍,徒費人工。高手看到此,自然就會想到將算法寫成模板。也正因有此困擾,筆者才開始正視C++語言中的“模板編程”,一旦走入這套精密強力卻又不廣為人知的機制,方知此處別有洞天。
幾番研究與實踐下來,筆者尚不敢稱對C++的模板編程掌握幾分,卻早已嘆於其對筆者編程思路革新起到巨大的幫助。從“萬物皆對象”,到如今漸漸變為關注設計容器及抽象算法,這是拜模板所賜。讚嘆之餘,不禁想嘗試寫一本書介紹C++中的模板編程,於人分享心得,於己則鞏固琢磨。不論章節條理,只求娓娓道來。如能對讀者略有裨益,便是幸甚。
讀者對象
本書假定讀者對C++的語法有基本了解,要求僅此而已。筆者盡力將C++語言中這一部分非常有趣的內容,用詳盡的示例以及平實的語言展現在讀者面前。即使是剛剛踏入C++隊伍的新兵,相信也能跟隨本書的進度,漸漸領略這一片C++秘境。而對於久經沙場的老兵,筆者限於自身閱歷有限,不敢誇口定能有所提高,唯有以誠意將所思所得寫下,請諸位老兵“擇其善者從之,其不善者改之”。
本書面向了解C++基本語法並有C++編程經歷的讀者。對C++模板編程技術、標準模板庫用法和原理感興趣的讀者,可以將本書作為一本入門與提高的書使用。對於經常開發中小型C++代碼庫的讀者,本書中有關模板高級編程技巧的內容可為您提供有益的補充。另外,本書中有關C++11新標準與模板技術的內容,也可作為對新標準的概要介紹供您參考。
如何閱讀本書
本書的內容分為四個部分。
模板基礎(第1~4章)介紹模板編程的基本概念與用法,並著重討論編譯器對模板的具體實現方法及其局限。學習完本部分之後,讀者可以理解模板的基本原理並自行實現簡單的類模板與函式模板。
標準庫中的模板(第5~9章)介紹標準庫中的算法與容器,並對其實現細節進行仔細推敲。算法與容器可以說是C++模板編程的最典型用法。C++程式設計師可以不知道模板編程技術,但不可能不用到由模板寫成的標準算法與容器。了解其實現原理的重要意義不言而喻。學習完本部分,讀者將能洞悉標準庫容器的實現原理,對標準庫中的算法、疊代器與容器之間的關係有深入的理解,從而可以精確調節標準容器的行為以及自行開發適用於標準算法的容器類模板等。
模板編程高級技巧(第10~13章)討論模板編程中“概念”的設計、控制代碼量的技術、編譯期邏輯的控制以及元編程的基本方法等。學習完本部分,讀者可以開發規模更大、更加智慧型的模板庫,並利用元編程技術實現編譯期的邏輯演繹與類型推導。
模板與C++11(第14~16章)介紹新標準C++11中的重要改進及其對模板編程的影響。在學習完本部分之後,讀者將能夠準確把握C++11的幾大重要革新的用意和用法,為利用新一代標準進行軟體開發打下堅實基礎。
勘誤和支持
除封面署名外,本書編寫工作的還有:陳凱、石少華、劉宏業、林文雯、王春、張敏、付強。由於筆者學識與經歷有限,書中內容難免有偏頗及謬誤之處。筆者將秉持謙虛的態度和開放的胸襟,認真對待各位讀者的批評與指教。書中的全部源檔案可以從華章網站下載,如您對本書內容有任何意見和建議,或者有關C++和程式設計的任何話題,歡迎傳送郵件至[email protected]和通過新浪微博@宇傑W與筆者交流。
致謝
感謝我的好友張哲君。作為本書草稿的第一位讀者,你的意見與鼓勵是我寫作本書的動力之源。
感謝機械工業出版社華章公司的各位同仁為本書的出版付出的辛勤勞動。特別要感謝楊福川編輯和白宇編輯,本書從草稿到成書的過程,離不開你們的精心指導與耐心審校。
最深深的謝意送給我的母親和我的妻子。沒有你們在我身邊一直默默地支持和付出,不會有提筆寫作的我,也不會有本書存在。
最美好的祝願送給我即將出生的孩子們。願你們快樂成長,並擁有淡定從容的人生。
最後,藉此機會,向C++語言的發明者BjarneStroustrup教授、標準模板庫的主要作者Alexander Stepanov和Meng Lee致以崇高的敬意。
溫宇傑