C++程序設計語言 第4版 上下冊

Bjarne Stroustrup

相關主題

商品描述

C++是一種通用程序設計語言。本書*介紹C++11標準,涵蓋了C++的發展歷程、設計理念、學習方法及新特性等內容。第1篇(第1~5章)包括C++的背景知識、C++語言及其標準庫的簡要介紹;第2篇(第6~15章)介紹C++的內置類型、基本特性及如何用它們構造程序;第3篇(第16~29章)介紹C++的抽象機制及如何用這些機制編寫面向對象程序和泛型程序;第4篇(第30~44章)概述標準庫並討論一些兼容性問題。本書從基本原理、規範等方面充分講解C++的語言特性和標準庫組件,並給出豐富的例子,為專業程序員提供*的C++知識體系。 本書可作為高等院校編程語言和C++相關課程的教材,也適合C++程序設計人員閱讀。

作者簡介

比亞內?斯特勞斯特魯普(Bjarne Stroustrup),C++ 語言的設計者和*初實現者,《C++ 程序設計語言》及《C++ 程序設計原理與實踐》等多部圖書作者。曾任職於貝爾實驗室、美國電話電報公司 (AT&T) 研究實驗室、得克薩斯農工大學及摩根士丹利紐約總部,於 2022 年退休。 Stroustrup 曾榮獲多項榮譽,包括 2018 年美國國家工程院查爾斯?斯塔克?德雷珀獎,以表彰他 “對 C++ 語言的構思與開發”。此外,Stroustrup 還是美國國家工程院院士、AT&T 會士、AT&T 貝爾實驗室會士、電氣電子工程師學會 (IEEE) 會士以及美國計算機協會 (ACM) 會士,並於 2013 年入選《電子設計》雜誌的工程名人堂。 Stroustrup 的研究領域包括分布式系統、仿真、設計、編程技術、軟件開發工具和編程語言等,同時積極參與 C++ 的 ANSI/ISO 標準化工作。 Stroustrup 擁有丹麥奧胡斯大學的碩士學位,以及英國劍橋大學的計算機科學博士學位。

目錄大綱

上冊

第 1篇 引言

第 1章 致讀者  2
 1.1 本書結構  2
  1.1.1 導言  2
  1.1.2 基本特性  3
  1.1.3 抽象機制  3
  1.1.4 標準庫  4
  1.1.5 示例和參考文獻  4
 1.2 C++的設計  5
  1.2.1 編程風格  6
  1.2.2 類型檢查  8
  1.2.3 C語言兼容性  9
  1.2.4 語言、庫和系統  9
 1.3 學習C++  10
  1.3.1 用C++編程  11
  1.3.2 對C++程序員的建議  12
  1.3.3 對C程序員的建議  12
  1.3.4 對Java程序員的建議  13
 1.4 C++的發展歷程  14
  1.4.1 大事年表  14
  1.4.2 早期的C++  15
  1.4.3 1998標準  16
  1.4.4 2011標準  17
  1.4.5 C++的用途  19
 1.5 建議  20
 1.6 參考資料  21

第 2章 C++之旅:基礎知識  24
 2.1 導言  24
 2.2 基礎知識  24
  2.2.1 Hello, World!  25
  2.2.2 類型、變量和算術運算  26
  2.2.3 常量  28
  2.2.4 測試和循環  28
  2.2.5 指針、數組和循環  29
 2.3 用戶自定義類型  31
  2.3.1 結構體  31
  2.3.2 類  32
  2.3.3 枚舉  33
 2.4 模塊化  34
  2.4.1 單獨編譯  35
  2.4.2 命名空間  36
  2.4.3 錯誤處理  37
 2.5 後記  39
 2.6 建議  39

第3章 C++之旅:抽象機制  40
 3.1 導言  40
 3.2 類  40
  3.2.1 具體類型  41
  3.2.2 抽象類型  44
  3.2.3 虛函數  46
  3.2.4 類層次結構  46
 3.3 覆制和移動  50
  3.3.1 覆制容器  50
  3.3.2 移動容器  51
  3.3.3 資源管理  53
  3.3.4 禁用操作  53
 3.4 模板  54
  3.4.1 參數化類型  54
  3.4.2 函數模板  55
  3.4.3 函數對象  56
  3.4.4 可變參數模板  58
  3.4.5 別名  58
 3.5 建議  59

第4章 C++之旅:容器和算法  60
 4.1 庫  60
  4.1.1 標準庫概述  60
  4.1.2 標準庫頭文件和命名空間  61
 4.2 字符串  62
 4.3 I/O流  63
  4.3.1 輸出  63
  4.3.2 輸入  64
  4.3.3 用戶自定義類型I/O  65
 4.4 容器  66
  4.4.1 vector  66
  4.4.2 list  68
  4.4.3 map  69
  4.4.4 unordered_map  70
  4.4.5 容器概述  70
 4.5 算法  71
  4.5.1 使用疊代器  72
  4.5.2 疊代器類型  73
  4.5.3 流疊代器  74
  4.5.4 謂詞  75
  4.5.5 算法概述  76
  4.5.6 容器算法  76
 4.6 建議  77

第5章 C++之旅:並發與實用工具  78
 5.1 導言  78
 5.2 資源管理  78
  5.2.1 unique_ptr和shared_ptr  79
 5.3 並發處理  80
  5.3.1 任務和線程  80
  5.3.2 傳遞參數  81
  5.3.3 返回結果  82
  5.3.4 共享數據  82
  5.3.5 任務間通信  84
 5.4 小型實用組件  86
  5.4.1 時間處理  87
  5.4.2 類型函數  87
  5.4.3 對組和元組  89
 5.5 正則表達式  90
 5.6 數值計算  90
  5.6.1 數學函數和算法  90
  5.6.2 覆數  91
  5.6.3 隨機數  91
  5.6.4 向量運算  92
  5.6.5 數值限制  93
 5.7 建議  93

第 2篇 基本特征

第6章 類型和聲明  96
 6.1 ISO C++標準  96
  6.1.1 實現  97
  6.1.2 基本源代碼字符集  97
 6.2 類型  97
  6.2.1 基本類型  98
  6.2.2 布爾類型  98
  6.2.3 字符類型  99
  6.2.4 整數類型  102
  6.2.5 浮點類型  104
  6.2.6 前綴和後綴  104
  6.2.7 void  105
  6.2.8 大小  105
  6.2.9 對齊  107
 6.3 聲明  107
  6.3.1 聲明的結構  109
  6.3.2 聲明多個名稱  110
  6.3.3 名稱  110
  6.3.4 作用域  111
  6.3.5 初始化  113
  6.3.6 類型推斷:auto和decltype()  116
 6.4 對象與值  118
  6.4.1 左值與右值  118
  6.4.2 對象的生命周期  118
 6.5 類型別名  119
 6.6 建議  120

第7章 指針、數組與引用  121
 7.1 導言  121
 7.2 指針  121
  7.2.1 void*  122
  7.2.2 nullptr  122
 7.3 數組  123
  7.3.1 數組初始化器  124
  7.3.2 字符串字面量  124
 7.4 指針與數組  127
  7.4.1 訪問數組  127
  7.4.2 多維數組  129
  7.4.3 傳遞數組  130
 7.5 指針與const  131
 7.6 指針與所有權  133
 7.7 引用  133
  7.7.1 左值引用  134
  7.7.2 右值引用  137
  7.7.3 引用的引用  139
  7.7.4 指針與引用  139
 7.8 建議  141

第8章 結構體、聯合體與枚舉  142
 8.1 導言  142
 8.2 結構體  142
  8.2.1 struct的布局  143
  8.2.2 struct的名稱  144
  8.2.3 結構體與類  145
  8.2.4 結構體與數組  146
  8.2.5 類型等價  148
  8.2.6 普通舊數據  149
  8.2.7 域  150
 8.3 聯合體  151
  8.3.1 聯合體與類  152
  8.3.2 匿名union  153
 8.4 枚舉  155
  8.4.1 enum class  155
  8.4.2 普通enum  158
  8.4.3 未命名enum  159
 8.5 建議  159

第9章 語句  160
 9.1 導言  160
 9.2 語句概述  160
 9.3 聲明作為語句  161
 9.4 選擇語句  162
  9.4.1 if語句  162
  9.4.2 switch語句  163
  9.4.3 條件中的聲明  165
 9.5 循環語句  166
  9.5.1 範圍for語句  166
  9.5.2 for語句  167
  9.5.3 while語句  168
  9.5.4 do語句  168
  9.5.5 循環退出  168
 9.6 goto語句  169
 9.7 註釋與縮進  169
 9.8 建議  171

第 10章 表達式  172
 10.1 導言  172
 10.2 桌面計算器示例  172
  10.2.1 語法分析器  172
  10.2.2 輸入  176
  10.2.3 底層輸入  179
  10.2.4 錯誤處理  179
  10.2.5 驅動程序  180
  10.2.6 頭文件  180
  10.2.7 命令行參數  181
  10.2.8 編程風格  182
 10.3 運算符概述  182
  10.3.1 結果  185
  10.3.2 求值順序  186
  10.3.3 運算符優先級  186
  10.3.4 臨時對象  187
 10.4 常量表達式  188
  10.4.1 符號常量  189
  10.4.2 常量表達式中的const  189
  10.4.3 字面量類型  190
  10.4.4 引用參數  190
  10.4.5 地址常量表達式  191
 10.5 隱式類型轉換  191
  10.5.1 提升  191
  10.5.2 類型轉換  192
  10.5.3 常規算術類型轉換  194
 10.6 建議  194

第 11章 選擇操作  195
 11.1 其他運算符  195
  11.1.1 邏輯運算符  195
  11.1.2 位邏輯運算符  195
  11.1.3 條件表達式  196
  11.1.4 遞增與遞減  197
 11.2 自由存儲區  198
  11.2.1 內存管理  199
  11.2.2 數組  201
  11.2.3 獲取內存空間  202
  11.2.4 重載new  203
 11.3 列表  204
  11.3.1 實現模型  205
  11.3.2 限定列表  206
  11.3.3 未限定列表  206
 11.4 lambda表達式  208
  11.4.1 實現模型  208
  11.4.2 lambda的替代  209
  11.4.3 捕獲  210
  11.4.4 調用與返回  212
  11.4.5 lambda的類型  213
 11.5 顯式類型轉換  213
  11.5.1 構造  214
  11.5.2 命名轉換  216
  11.5.3 C風格轉換  217
  11.5.4 函數風格轉換  217
 11.6 建議  217

第 12章 函數  218
 12.1 函數聲明  218
  12.1.1 為什麼使用函數  218
  12.1.2 函數聲明的組成  219
  12.1.3 函數定義  219
  12.1.4 返回值  220
  12.1.5 inline函數  222
  12.1.6 constexpr函數  222
  12.1.7 帶有[[noreturn]]的函數  224
  12.1.8 局部變量  224
 12.2 參數傳遞  225
  12.2.1 引用參數  226
  12.2.2 數組參數  227
  12.2.3 列表參數  228
  12.2.4 未定數量的參數  230
  12.2.5 默認參數  232
 12.3 重載函數  233
  12.3.1 自動重載解析  234
  12.3.2 重載與返回類型  235
  12.3.3 重載與作用域  235
  12.3.4 多實參解析  236
  12.3.5 手動重載解析  236
 12.4 前置與後置條件  237
 12.5 函數指針  238
 12.6 宏  241
  12.6.1 條件編譯  244
  12.6.2 預定義宏  244
  12.6.3 編譯指令  245
 12.7 建議  245

第 13章 異常處理  246
 13.1 錯誤處理  246
  13.1.1 異常  246
  13.1.2 傳統的錯誤處理  247
  13.1.3 應付過去  248
  13.1.4 異常的替代觀點  249
  13.1.5 何時不能使用異常  249
  13.1.6 層次化錯誤處理  250
  13.1.7 異常與效率  251
 13.2 異常保證  252
 13.3 資源管理  253
  13.3.1 finally  256
 13.4 強制不變式  257
 13.5 拋出和捕獲異常  260
  13.5.1 拋出異常  260
  13.5.2 捕獲異常  263
  13.5.3 異常與線程  268
 13.6 vector的實現  268
  13.6.1 一個簡單的vector  268
  13.6.2 顯式表示內存  271
  13.6.3 賦值  273
  13.6.4 改變大小  275
 13.7 建議  277

第 14章 命名空間  278
 14.1 組合問題  278
 14.2 命名空間  279
  14.2.1 顯式限定  280
  14.2.2 using聲明  281
  14.2.3 using指令  282
  14.2.4 參數依賴查找  283
  14.2.5 命名空間是開放的  284
 14.3 模塊化與接口  285
  14.3.1 命名空間作為模塊  286
  14.3.2 實現  287
  14.3.3 接口和實現  289
 14.4 使用命名空間組合代碼  290
  14.4.1 便利性與*性  290
  14.4.2 命名空間別名  291
  14.4.3 組合命名空間  291
  14.4.4 組合與選擇  292
  14.4.5 命名空間與重載  293
  14.4.6 版本控制  295
  14.4.7 嵌套命名空間  297
  14.4.8 未命名命名空間  297
  14.4.9 C頭文件  298
 14.5 建議  299

第 15章 源文件與程序  300
 15.1 單獨編譯  300
 15.2 鏈接  301
  15.2.1 文件局部名稱  303
  15.2.2 頭文件  303
  15.2.3 單一定義規則  304
  15.2.4 標準庫頭文件  306
  15.2.5 鏈接非C++代碼  307
  15.2.6 鏈接與函數指針  308
 15.3 使用頭文件  309
  15.3.1 單頭文件組織  309
  15.3.2 多頭文件組織  312
  15.3.3 包含保護  315
 15.4 程序  316
  15.4.1 非局部變量初始化  316
  15.4.2 初始化與並發  317
  15.4.3 程序終止  317
 15.5 建議  318

第3篇 抽象機制

第 16章 類  320
 16.1 導言  320
 16.2 類的基本概念  321
  16.2.1 成員函數  321
  16.2.2 默認覆制  322
  16.2.3 訪問控制  322
  16.2.4 類和結構體  323
  16.2.5 構造函數  324
  16.2.6 顯式構造函數  326
  16.2.7 類內初始化器  328
  16.2.8 類內函數定義  328
  16.2.9 可變性  329
  16.2.10 自引用  331
  16.2.11 成員訪問  333
  16.2.12 靜態成員  334
  16.2.13 成員類型  335
 16.3 具體類  336
  16.3.1 成員函數  338
  16.3.2 輔助函數  340
  16.3.3 重載運算符  341
  16.3.4 具體類的意義  342
 16.4 建議  343

第 17章 構造、清理、覆制和移動  344
 17.1 導言  344
 17.2 構造函數和析構函數  345
  17.2.1 構造函數和不變式  346
  17.2.2 析構函數和資源  347
  17.2.3 基類和成員析構函數  348
  17.2.4 調用構造函數和析構函數  348
  17.2.5 虛析構函數  349
 17.3 類對象初始化  350
  17.3.1 不使用構造函數進行初始化  350
  17.3.2 使用構造函數進行初始化  351
  17.3.3 默認構造函數  353
  17.3.4 初始化器列表構造函數  355
 17.4 成員初始化和基類初始化  358
  17.4.1 成員初始化  359
  17.4.2 基類初始化器  360
  17.4.3 委托構造函數  360
  17.4.4 類內初始化器  361
  17.4.5 static成員初始化  363
 17.5 覆制和移動  364
  17.5.1 覆制  364
  17.5.2 移動  369
 17.6 生成默認操作  372
  17.6.1 顯式聲明默認操作  372
  17.6.2 默認操作  373
  17.6.3 使用默認操作  373
  17.6.4 使用delete刪除的函數  376
 17.7 建議  378

第 18章 運算符重載  379
 18.1 導言  379
 18.2 運算符函數  380
  18.2.1 二元和一元運算符  381
  18.2.2 運算符的預置含義  382
  18.2.3 運算符和用戶自定義類型  382
  18.2.4 傳遞對象  383
  18.2.5 命名空間中的運算符  383
 18.3 覆數類型  385
  18.3.1 成員和非成員運算符  385
  18.3.2 混合模式運算  386
  18.3.3 類型轉換  387
  18.3.4 字面量  389
  18.3.5 訪問函數  390
  18.3.6 輔助函數  390
 18.4 類型轉換  391
  18.4.1 類型轉換運算符  391
  18.4.2 顯式類型轉換運算符  393
  18.4.3 歧義  393
 18.5 建議  394

第 19章 特殊運算符  396
 19.1 導言  396
 19.2 特殊運算符  396
  19.2.1 取下標  396
  19.2.2 函數調用  397
  19.2.3 解引用  398
  19.2.4 自增和自減  400
  19.2.5 分配和釋放  401
  19.2.6 用戶自定義字面量  402
 19.3 字符串類  405
  19.3.1 基本操作  405
  19.3.2 訪問字符  406
  19.3.3 類的表示  407
  19.3.4 成員函數  409
  19.3.5 輔助函數  410
  19.3.6 應用String  412
 19.4 友元  413
  19.4.1 發現友元  414
  19.4.2 友元與成員  415
 19.5 建議  416

第 20章 派生類  417
 20.1 導言  417
 20.2 派生類  418
  20.2.1 成員函數  419
  20.2.2 構造函數和析構函數  420
 20.3 類層次結構  421
  20.3.1 類型域  421
  20.3.2 虛函數  423
  20.3.3 顯式限定  425
  20.3.4 覆蓋控制  425
  20.3.5 using基類成員  428
  20.3.6 返回類型放寬  431
 20.4 抽象類  432
 20.5 訪問控制  434
  20.5.1 受保護成員  436
  20.5.2 訪問基類  437
  20.5.3 using聲明和訪問控制  438
 20.6 成員指針  439
  20.6.1 函數成員指針  439
  20.6.2 數據成員指針  441
  20.6.3 基類和派生類成員  441
 20.7 建議  442

第 21章 類層次結構  443
 21.1 導言  443
 21.2 類層次結構的設計  443
  21.2.1 實現繼承  443
  21.2.2 接口繼承  446
  21.2.3 替代實現  447
  21.2.4 定位對象創建  450
 21.3 多重繼承  451
  21.3.1 多重接口  451
  21.3.2 多重實現類  451
  21.3.3 *歧義  453
  21.3.4 重覆使用基類  455
  21.3.5 虛基類  456
  21.3.6 重覆基類與虛基類  460
 21.4 建議  462

下冊

第 22章 運行時類型信息  463
 22.1 導言  463
 22.2 類層次結構導航  463
  22.2.1 dynamic_cast  464
  22.2.2 多重繼承  466
  22.2.3 static_cast和dynamic_cast  467
  22.2.4 恢覆接口  468
 22.3 雙重分發和訪問者  471
  22.3.1 雙重分發  472
  22.3.2 訪問者  473
 22.4 構造和析構  475
 22.5 類型識別  475
  22.5.1 擴展類型信息  477
 22.6 RTII的使用和誤用  478
 22.7 建議  479

第 23章 模板  480
 23.1 介紹與概述  480
 23.2 一個簡單字符串模板  481
  23.2.1 定義模板  483
  23.2.2 模板實例化  484
 23.3 類型檢查  484
  23.3.1 類型等價性  485
  23.3.2 錯誤檢測  486
 23.4 類模板成員  487
  23.4.1 數據成員  487
  23.4.2 成員函數  487
  23.4.3 成員類型別名  487
  23.4.4 靜態成員  488
  23.4.5 成員類型  488
  23.4.6 成員模板  489
  23.4.7 友元  492
 23.5 函數模板  493
  23.5.1 函數模板實參  495
  23.5.2 函數模板實參推斷  496
  23.5.3 函數模板重載  498
 23.6 模板別名  501
 23.7 源代碼組織  502
  23.7.1 鏈接  503
 23.8 建議  504

第 24章 泛型編程  505
 24.1 導言  505
 24.2 算法和提升  506
 24.3 概念  508
  24.3.1 探索概念  509
  24.3.2 概念和約束  511
 24.4 具體化概念  512
  24.4.1 公理  514
  24.4.2 多實參概念  515
  24.4.3 值概念  516
  24.4.4 約束檢查  517
  24.4.5 模板定義檢查  517
 24.5 建議  519

第 25章 特化  520
 25.1 導言  520
 25.2 模板形參和實參  520
  25.2.1 類型作為實參  521
  25.2.2 值作為實參  522
  25.2.3 操作作為實參  523
  25.2.4 模板作為實參  525
  25.2.5 默認模板實參  525
 25.3 特化  527
  25.3.1 接口特化  528
  25.3.2 主模板  530
  25.3.3 特化順序  531
  25.3.4 函數模板特化  531
 25.4 建議  533

第 26章 實例化  534
 26.1 導言  534
 26.2 模板實例化  534
  26.2.1 何時需要實例化  535
  26.2.2 手動控制實例化  536
 26.3 名稱綁定  537
  26.3.1 依賴名稱  538
  26.3.2 定義點綁定  539
  26.3.3 實例化點綁定  540
  26.3.4 多實例化點  542
  26.3.5 模板和命名空間  543
  26.3.6 過於激進的ADL  543
  26.3.7 來自基類的名稱  545
 26.4 建議  547

第 27章 模板和層次結構  548
 27.1 導言  548
 27.2 參數化和層次結構  548
  27.2.1 生成類型  550
  27.2.2 模板類型轉換  551
 27.3 類模板層次結構  552
  27.3.1 模板作為接口  553
 27.4 模板參數作為基類  553
  27.4.1 組合數據結構  554
  27.4.2 線性化類層次結構  557
 27.5 建議  561

第 28章 元編程  562
 28.1 導言  562
 28.2 類型函數  563
  28.2.1 類型別名  565
  28.2.2 類型謂詞  566
  28.2.3 選擇函數  567
  28.2.4 萃取  568
 28.3 控制結構  569
  28.3.1 選擇  569
  28.3.2 疊代和遞歸  572
  28.3.3 何時使用元編程  573
 28.4 條件定義:Enable_if  573
  28.4.1 使用Enable_if  575
  28.4.2 實現Enable_if  576
  28.4.3 Enable_if和概念  576
  28.4.4 更多Enable_if示例  577
 28.5 編譯時列表: Tuple  579
  28.5.1 一個簡單的輸出函數  580
  28.5.2 元素訪問  581
  28.5.3 make_tuple  584
 28.6 可變參數模板  584
  28.6.1 一個類型*的printf()  584
  28.6.2 技術細節  586
  28.6.3 轉發  587
  28.6.4 標準庫tuple  588
 28.7 國際標準單位示例  591
  28.7.1 Unit  591
  28.7.2 Quantity  592
  28.7.3 Unit字面量  594
  28.7.4 實用函數  594
 28.8 建議  596

第 29章 矩陣設計  597
 29.1 導言  597
  29.1.1 基本矩陣用途  597
  29.1.2 矩陣要求  599
 29.2 矩陣模板  599
  29.2.1 構造和賦值  600
  29.2.2 下標和切片  602
 29.3 矩陣算術運算  604
  29.3.1 標量運算  604
  29.3.2 加法  605
  29.3.3 乘法  606
 29.4 矩陣實現  607
  29.4.1 slice()  607
  29.4.2 矩陣切片  608
  29.4.3 Matrix_ref  609
  29.4.4 矩陣列表初始化  610
  29.4.5 矩陣訪問  612
  29.4.6 *維矩陣  614
 29.5 解線性方程  614
  29.5.1 *高斯消元法  615
  29.5.2 主元選取  616
  29.5.3 測試  616
  29.5.4 熔合運算  617
 29.6 建議  619

第4篇 標準庫

第30章 標準庫概覽  622
 30.1 導言  622
  30.1.1 標準庫設施  622
  30.1.2 設計約束  623
  30.1.3 描述風格  624
 30.2 頭文件  624
 30.3 語言支持  628
  30.3.1 initializer_list支持  628
  30.3.2 範圍for支持  629
 30.4 錯誤處理  629
  30.4.1 異常  629
  30.4.2 斷言  632
  30.4.3 system_error  633
 30.5 建議  640

第31章 STL容器  642
 31.1 導言  642
 31.2 容器概覽  642
  31.2.1 容器表示  644
  31.2.2 元素要求  645
 31.3 操作概覽  647
  31.3.1 成員類型  649
  31.3.2 構造函數、析構函數和賦值操作  650
  31.3.3 大小和容量  651
  31.3.4 疊代器  651
  31.3.5 元素訪問  652
  31.3.6 棧操作  653
  31.3.7 列表操作  653
  31.3.8 其他操作  654
 31.4 容器  654
  31.4.1 vector  654
  31.4.2 鏈表  657
  31.4.3 關聯容器  659
 31.5 容器適配器  667
  31.5.1 stack  668
  31.5.2 queue  669
  31.5.3 priority_queue  669
 31.6 建議  670

第32章 STL算法  672
 32.1 導言  672
 32.2 算法  672
  32.2.1 序列  672
 32.3 策略實參  674
  32.3.1 覆雜度  675
 32.4 不修改序列的算法  675
  32.4.1 for_each()  675
  32.4.2 序列謂詞  676
  32.4.3 count()  676
  32.4.4 find()  676
  32.4.5 equal()和mismatch()  677
  32.4.6 search()  678
 32.5 修改序列的算法  678
  32.5.1 copy()  679
  32.5.2 unique()  679
  32.5.3 remove()和replace()  680
  32.5.4 rotate()、random_shuffle()和partition()  681
  32.5.5 排列  682
  32.5.6 fill()  682
  32.5.7 swap()  683
 32.6 排序和搜索  683
  32.6.1 二分搜索  685
  32.6.2 merge()  686
  32.6.3 集合算法  687
  32.6.4 堆  688
  32.6.5 lexicographical_compare()  688
 32.7 *小值和*值  689
 32.8 建議  690

第33章 STL疊代器  691
 33.1 導言  691
  33.1.1 疊代器模型  691
  33.1.2 疊代器類別  692
  33.1.3 疊代器萃取  693
  33.1.4 疊代器操作  695
 33.2 疊代器適配器  696
  33.2.1 反向疊代器  696
  33.2.2 插入疊代器  698
  33.2.3 移動疊代器  699
 33.3 範圍訪問函數  699
 33.4 函數對象  700
 33.5 函數適配器  701
  33.5.1 bind()  701
  33.5.2 mem_fn()  703
  33.5.3 function  703
 33.6 建議  705

第34章 內存和資源  706
 34.1 導言  706
 34.2 “擬容器”  706
  34.2.1 array  707
  34.2.2 bitset  709
  34.2.3 vector   712
  34.2.4 元組  713
 34.3 資源管理指針  716
  34.3.1 unique_ptr  716
  34.3.2 shared_ptr  719
  34.3.3 weak_ptr  721
 34.4 分配器  723
  34.4.1 默認分配器  724
  34.4.2 分配器萃取  725
  34.4.3 指針萃取  726
  34.4.4 限域的分配器  726
 34.5 垃圾收集接口  728
 34.6 未初始化內存  730
  34.6.1 臨時緩沖區  730
  34.6.2 raw_storage_iterator  730
 34.7 建議  731

第35章 工具  732
 35.1 導言  732
 35.2 時間  732
  35.2.1 duration  733
  35.2.2 time_point  735
  35.2.3 時鐘  736
  35.2.4 時間萃取  737
 35.3 編譯時有理數運算  738
 35.4 類型函數  739
  35.4.1 類型萃取  739
  35.4.2 類型生成器  742
 35.5 更多工具  746
  35.5.1 move()和forward()  747
  35.5.2 swap()  747
  35.5.3 關系運算符  748
  35.5.4 比較和哈希type_info  749
 35.6 建議  749

第36章 字符串  750
 36.1 導言  750
 36.2 字符分類  750
  36.2.1 分類函數  750
  36.2.2 字符萃取  751
 36.3 字符串  752
  36.3.1 string與C風格字符串  753
  36.3.2 構造函數  754
  36.3.3 基本操作  755
  36.3.4 字符串I/O  756
  36.3.5 數值轉換  757
  36.3.6 類STL操作  758
  36.3.7 find系列函數  760
  36.3.8 子串  761
 36.4 建議  762

第37章 正則表達式  763
 37.1 正則表達式  763
  37.1.1 正則表達式表示法  764
 37.2 regex  767
  37.2.1 匹配結果  768
  37.2.2 格式化  771
 37.3 正則表達式函數  771
  37.3.1 regex_match()  772
  37.3.2 regex_search()  773
  37.3.3 regex_replace()  774
 37.4 正則表達式疊代器  775
  37.4.1 regex_iterator  775
  37.4.2 regex_token_iterator  776
 37.5 regex_traits  778
 37.6 建議  778

第38章 I/O流  779
 38.1 導言  779
 38.2 I/O流層次結構  781
  38.2.1 文件流  781
  38.2.2 字符串流  782
 38.3 錯誤處理  784
 38.4 I/O操作  785
  38.4.1 輸入操作  785
  38.4.2 輸出操作  788
  38.4.3 操縱符  789
  38.4.4 流狀態  790
  38.4.5 格式化  794
 38.5 流疊代器  799
 38.6 緩沖  800
  38.6.1 輸出流和緩沖區  802
  38.6.2 輸入流和緩沖區  803
  38.6.3 緩沖區疊代器  804
 38.7 建議  805

第39章 區域設置  807
 39.1 處理文化差異  807
 39.2 locale類  809
  39.2.1 命名的locale  810
  39.2.2 string的比較  813
 39.3 facet類  813
  39.3.1 訪問locale中的facet  814
  39.3.2 一個簡單的用戶自定義facet  815
  39.3.3 locale和facet的使用  817
 39.4 標準facet  817
  39.4.1 string的比較  819
  39.4.2 數值格式化  821
  39.4.3 貨幣格式化  825
  39.4.4 日期和時間格式化  829
  39.4.5 字符分類  831
  39.4.6 字符編碼轉換  834
  39.4.7 消息  837
 39.5 便利接口  840
  39.5.1 字符分類  840
  39.5.2 字符轉換  841
  39.5.3 字符串轉換  841
  39.5.4 緩沖區轉換  842
 39.6 建議  843

第40章 數值  844
 40.1 導言  844
 40.2 數值極限  844
  40.2.1 數值極限宏  846
 40.3 標準數學函數  847
 40.4 complex覆數  848
 40.5 數值數組:valarray  849
  40.5.1 構造函數和賦值  849
  40.5.2 下標  851
  40.5.3 運算  852
  40.5.4 切片  854
  40.5.5 slice_array  856
  40.5.6 通用切片  856
 40.6 通用數值算法  857
  40.6.1 accumulate()  858
  40.6.2 inner_product()  859
  40.6.3 partial_sum()與adjacent_difference()  859
  40.6.4 iota()  860
 40.7 隨機數  860
  40.7.1 引擎  862
  40.7.2 隨機設備  864
  40.7.3 分布  864
  40.7.4 C風格隨機數  867
 40.8 建議  868

第41章 並發  869
 41.1 導言  869
 41.2 內存模型  870
  41.2.1 內存位置  870
  41.2.2 指令重排  871
  41.2.3 內存序  872
  41.2.4 數據競爭  873
 41.3 原子性  874
  41.3.1 原子類型  875
  41.3.2 原子標誌和柵欄  879
 41.4 volatile  880
 41.5 建議  880

第42章 線程和任務  881
 42.1 導言  881
 42.2 線程  881
  42.2.1 身份  882
  42.2.2 構造  883
  42.2.3 析構  884
  42.2.4 join()  884
  42.2.5 detach()  885
  42.2.6 命名空間this_thread  886
  42.2.7 殺死thread  887
  42.2.8 thread_local數據  887
 42.3 避免數據競爭  888
  42.3.1 互斥量  889
  42.3.2 多重鎖  895
  42.3.3 call_once()  896
  42.3.4 條件變量  897
 42.4 基於任務的並發  900
  42.4.1 future和promise  901
  42.4.2 promise  901
  42.4.3 packaged_task  902
  42.4.4 future  905
  42.4.5 shared_future  907
  42.4.6 async()  907
  42.4.7 一個並行find()示例  909
 42.5 建議  911

第43章 C標準庫  913
 43.1 導言  913
 43.2 文件  913
 43.3 printf()系列函數  914
 43.4 C風格字符串  916
 43.5 內存  917
 43.6 日期和時間  918
 43.7 其他  921
 43.8 建議  922

第44章 兼容性  923
 44.1 導言  923
 44.2 C++11擴展  923
  44.2.1 語言特性  923
  44.2.2 標準庫組件  924
  44.2.3 棄用特性  925
  44.2.4 應對早期C++實現  926
 44.3 C/C++兼容性  926
  44.3.1 C和C++是兄弟  926
  44.3.2 “靜默”差異  927
  44.3.3 不兼容C++的C代碼  928
  44.3.4 不兼容C的C++代碼  930
 44.4 建議  931