第 2 版譯序 xxi
第 2 版序言 xxiii
第 2 版緻謝 xxiv
第 1 版序言 xxv
第 1 版緻謝 xxvi
1 關於本書 1
1.1 緣起 1
1.2 閱讀前的必要基礎 2
1.3 本書風格與結構 2
1.4 如何閱讀本書 4
1.5 目前發展情勢 5
1.6 範例代碼及額外信息 5
1.7 反饋 5
2 C++ 及標準庫簡介 7
2.1 C++ Standard 的曆史 7
2.1.1 C++11 Standard 常見疑問 8
2.1.2 C++98 和 C++11 的兼容性 9
2.2 復雜度與 Big-O 標記 10
3 語言新特性 13
3.1 C++11 語言新特性 13
3.1.1 微小但重要的語法提升 13
3.1.2 以auto完成類型自動推導 14
3.1.3 一緻性初始化(Uniform Initialization)與初值列(Initializer List) 15
3.1.4 Range-Based for循環 17
3.1.5 Move 語義和 Rvalue Reference 19
3.1.6 新式的字符串字麵常量(String Literal) 23
3.1.7 關鍵字noexcept 24
3.1.8 關鍵字constexpr 26
3.1.9 嶄新的 Template 特性 26
3.1.10 Lambda 28
3.1.11 關鍵字decltype 32
3.1.12 新的函數聲明語法(New Function Declaration Syntax) 32
3.1.13 帶領域的(Scoped) Enumeration 32
3.1.14 新的基礎類型(New Fundamental Data Type) 33
3.2 雖舊猶新的語言特性 33
3.2.1 基礎類型的明確初始化(Explicit Initialization for Fundamental Type) 37
3.2.2 main()定義式 37
4 一般概念 39
4.1 命名空間(Namespace)std 39
4.2 頭文件(Header File) 40
4.3 差錯和異常(Error and Exception)的處理 41
4.3.1 標準的 Exception Class(異常類) 41
4.3.2 異常類(Exception Class)的成員 44
4.3.3 以 Class exception_ptr傳遞異常 52
4.3.4 拋齣標準異常 53
4.3.5 自標準異常類派生 54
4.4 Callable Object(可被調用的對象) 54
4.5 並發與多綫程 55
4.6 分配器(Allocator) 57
5 通用工具 59
5.1 Pair 和 Tuple 60
5.1.1 Pair 60
5.1.2 Tuple(不定數的值組) 68
5.1.3 Tuple 的輸入/輸齣 74
5.1.4 tuple和pair轉換 75
5.2 Smart Pointer(智能指針) 76
5.2.1 Class shared_ptr 76
5.2.2 Class weak_ptr 84
5.2.3 誤用 Shared Pointer 89
5.2.4 細究 Shared Pointer 和 Weak Pointer 92
5.2.5 Class unique_ptr 98
5.2.6 細究 Class unique_ptr 110
5.2.7 Class auto_ptr 113
5.2.8 Smart Pointer 結語 114
5.3 數值的極值(Numeric Limit) 115
5.4 Type Trait 和 Type Utility 122
5.4.1 Type Trait 的目的 122
5.4.2 細究 Type Trait 125
5.4.3 Reference Wrapper(外覆器) 132
5.4.4 Function Type Wrapper(外覆器) 133
5.5 輔助函數 134
5.5.1 挑選最小值和最大值 134
5.5.2 兩值互換(Swapping) 136
5.5.3 增補的“比較操作符”(Comparison Operator) 138
5.6 Class ratio<>的編譯期分數運算 140
5.7 Clock 和 Timer 143
5.7.1 Chrono 程序庫概觀 143
5.7.2 Duration(時間段) 144
5.7.3 Clock(時鍾)和 Timepoint(時間點) 149
5.7.4 C 和 POSIX 提供的 Date/Time 函數 157
5.7.5 以計時器停滯綫程(Blocking with Timer) 160
5.8 頭文件<cstddef>、<cstdlib>和<cstring> 161
5.8.1 <cstddef>內的各項定義 161
5.8.2 <cstdlib>內的各種定義 162
5.8.3 <cstring>中的定義式 163
6 標準模闆庫 165
6.1 STL 組件(Component) 165
6.2 容器(Container) 167
6.2.1 序列式容器(Sequence Container) 169
6.2.2 關聯式容器(Associative Container) 177
6.2.3 無序容器(Unordered Container) 180
6.2.4 關聯式數組(Associative Array) 185
6.2.5 其他容器 187
6.2.6 容器適配器(Container Adapter) 188
6.3 迭代器(Iterator) 188
6.3.1 關聯式( Associative )及無序( Unordered )容器的更多實例 193
6.3.2 迭代器種類(Iterator Category) 198
6.4 算法(Algorithm) 199
6.4.1 區間(Range) 203
6.4.2 處理多重區間(Multiple Ranges) 207
6.5 迭代器之適配器(Iterator Adapter) 210
6.5.1 Insert Iterator(安插型迭代器) 210
6.5.2 Stream Iterator(串流迭代器) 212
6.5.3 Reverse Iterator(反嚮迭代器) 214
6.5.4 Move Iterator(搬移迭代器) 216
6.6 用戶自定義的泛型函數(User-Defined Generic Function) 216
6.7 更易型算法(Manipulating Algorithm) 217
6.7.1 移除(Removing)元素 218
6.7.2 更易 Associative(關聯式)和 Unordered(無序)容器 221
6.7.3 算法 vs. 成員函數 223
6.8 以函數作為算法的實參 224
6.8.1 以函數作為算法實參的實例示範 224
6.8.2 判斷式(Predicate) 226
6.9 使用 Lambda 229
6.10 函數對象(Function Object) 233
6.10.1 定義一個函數對象 233
6.10.2 預定義的函數對象 239
6.10.3 Binder 241
6.10.4 函數對象 vs. Lambda 243
6.11 容器內的元素 244
6.11.1 容器元素的必要條件 244
6.11.2 Value 語義 vs. Reference 語義 245
6.12 STL 內部的錯誤和異常 245
6.12.1 錯誤處理(Error Handling) 246
6.12.2 異常處理(Exception Handling) 248
6.13 擴展 STL 250
6.13.1 整閤更多 Type 250
6.13.2 派生自 STL Type 251
7 STL 容器 253
7.1 容器的共通能力和共通操作 254
7.1.1 容器的共通能力 254
7.1.2 容器的共通操作 254
7.1.3 容器提供的類型 260
7.2 Array 261
7.2.1 Array 的能力 261
7.2.2 Array 的操作 263
7.2.3 把array當成 C-Style Array 267
7.2.4 異常處理( Exception Handling ) 268
7.2.5 Tuple 接口 268
7.2.6 Array 運用實例 268
7.3 Vector 270
7.3.1 Vector 的能力 270
7.3.2 Vector 的操作 273
7.3.3 將 Vector 當作 C-Style Array 使用 278
7.3.4 異常處理( Exception Handling ) 278
7.3.5 Vector 使用實例 279
7.3.6 Class vector<bool> 281
7.4 Deque 283
7.4.1 Deque 的能力 284
7.4.2 Deque 的操作函數 284
7.4.3 Exception Handling 288
7.4.4 Deque 運用實例 288
7.5 List 290
7.5.1 List 的能力 290
7.5.2 List 的操作 291
7.5.3 異常處理( Exception Handling ) 296
7.5.4 List 運用實例 298
7.6 Forward List 300
7.6.1 Forward List 的能力 300
7.6.2 Forward List 的操作 302
7.6.3 異常處理( Exception Handling ) 311
7.6.4 Forward List 運用實例 312
7.7 Set 和 Multiset 314
7.7.1 Set 和 Multiset 的能力 315
7.7.2 Set and Multiset 的操作函數 316
7.7.3 異常處理( Exception Handling ) 325
7.7.4 Set 和 Multiset 運用實例 325
7.7.5 運行期指定排序準則 328
7.8 Map 和 Multimap 331
7.8.1 Map 和 Multimap 的能力 332
7.8.2 Map 和 Multimap 的操作函數 333
7.8.3 將 Map 視為關聯式數組( Associative Array ) 343
7.8.4 異常處理( Exception Handling ) 345
7.8.5 Map 和 Multimap 運用實例 345
7.8.6 綜閤實例:運用 Map、 String 並於運行期指定排序準則 351
7.9 無序容器( Unordered Container ) 355
7.9.1 Unordered 容器的能力 357
7.9.2 創建和控製 Unordered 容器 359
7.9.3 Unordered 容器的其他操作 367
7.9.4 Bucket 接口 374
7.9.5 使用 Unordered Map 作為 Associative Array 374
7.9.6 異常處理( Exception Handling ) 375
7.9.7 Unordered 容器的運用實例 375
7.10 其他 STL 容器 385
7.10.1 String 作為一種 STL 容器 385
7.10.2 C-Style Array 作為一種 STL 容器 386
7.11 實現 Reference 語義 388
7.12 各種容器的使用時機 392
8 細探 STL 容器成員 397
8.1 容器內的類型 397
8.2 創建、復製和銷毀( Create, Copy, and Destroy ) 400
8.3 非更易型操作( Nonmodifying Operation ) 403
8.3.1 大小相關操作( Size Operation ) 403
8.3.2 元素比較( Comparison Operation ) 404
8.3.3 Associative 和 Unordered 容器特有的非更易型操作 404
8.4 賦值( Assignment ) 406
8.5 元素直接訪問( Direct Element Access ) 408
8.6 “産齣迭代器”之各項操作 410
8.7 安插和移除( Inserting and Removing )元素 411
8.7.1 安插單一元素( Inserting Single Element ) 411
8.7.2 安插多重元素( Inserting Multiple Elements ) 416
8.7.3 移除元素( Removing Element ) 417
8.7.4 重設大小( Resizing ) 420
8.8 List 和 Forward List 的特殊成員函數 420
8.8.1 特殊成員函數(針對 List 和 Forward List ) 420
8.8.2 特殊成員函數(隻針對 Forward List ) 423
8.9 容器的策略接口( Policy Interface ) 427
8.9.1 非更易型策略函數( Nonmodifying Policy Function ) 427
8.9.2 更易型策略函數( Modifying Policy Function ) 428
8.9.3 Unordered 容器的 Bucket 相關接口 429
8.10 對分配器( Allocator )的支持 430
8.10.1 基本的分配器成員( Fundamental Allocator Member ) 430
8.10.2 帶有“可選之分配器參數”的構造函數 430
9 STL 迭代器 433
9.1 迭代器頭文件( Header Files for Iterators ) 433
9.2 迭代器種類( Iterator Category ) 433
9.2.1 Output 迭代器 433
9.2.2 Input 迭代器 435
9.2.3 Forward(前嚮)迭代器 436
9.2.4 Bidirectional(雙嚮)迭代器 437
9.2.5 Random-Access(隨機訪問)迭代器 438
9.2.6 Vector 迭代器的遞增( Increment )和遞減( Decrement ) 440
9.3 迭代器相關輔助函數 441
9.3.1 advance() 441
9.3.2 next()和prev() 443
9.3.3 distance() 445
9.3.4 iter_swap() 446
9.4 迭代器適配器( Iterator Adapter ) 448
9.4.1 Reverse(反嚮)迭代器 448
9.4.2 Insert(安插型)迭代器 454
9.4.3 Stream(串流)迭代器 460
9.4.4 Move(搬移)迭代器 466
9.5 Iterator Trait(迭代器特性) 466
9.5.1 為迭代器編寫泛型函數( Generic Function ) 468
9.6 用戶自定義( User-Defined )迭代器 471
10 STL 函數對象及 Lambda 475
10.1 Function Object(函數對象)的概念 475
10.1.1 以 Function Object 為排序準則( Sorting Criterion ) 476
10.1.2 Function Object 擁有內部狀態( Internal State ) 478
10.1.3 for_each()的返迴值 482
10.1.4 Predicate(判斷式) vs. Function Object(函數對象) 483
10.2 預定義的 Function Object 和 Binder 486
10.2.1 預定義的 Function Object 486
10.2.2 Function Adapter 和 Binder 487
10.2.3 以 Function Adapter 搭配用戶自定義的 Function Object 495
10.2.4 過時的( Deprecated ) Function Adapter 497
10.3 運用 Lambda 499
10.3.1 Lambda vs. Binder 499
10.3.2 Lambda vs. 帶有狀態的( Stateful ) Function Object 500
10.3.3 Lambda 調用全局函數和成員函數 502
10.3.4 Lambda 作為 Hash 函數、排序準則或相等準則 504
11 STL 算法 505
11.1 算法頭文件(Header File) 505
11.2 算法概觀 505
11.2.1 扼要介紹 506
11.2.2 算法分門彆類 506
11.3 輔助函數 517
11.4 for_each()算法 519
11.5 非更易型算法(Nonmodifying Algorithm) 524
11.5.1 元素計數 524
11.5.2 最小值和最大值 525
11.5.3 查找元素(Searching Element) 528
11.5.4 區間的比較 542
11.5.5 Predicate 用以檢驗區間 550
11.6 更易型算法(Modifying Algorithm) 557
11.6.1 復製元素(Copying Element) 557
11.6.2 搬移元素(Moving Element) 561
11.6.3 轉換和結閤元素(Transforming and Combining Element) 563
11.6.4 互換元素(Swapping Elements) 566
11.6.5 賦值(Assigning New Value) 568
11.6.6 替換元素(Replacing Element) 571
11.7 移除型算法(Removing Algorithm) 575
11.7.1 移除某些元素 575
11.7.2 移除重復元素 578
11.8 變序型算法(Mutating Algorithm) 583
11.8.1 反轉元素次序(Reversing the Order of Elements) 583
11.8.2 鏇轉元素(Rotating Elements) 584
11.8.3 排列元素(Permuting Elements) 587
11.8.4 對元素重新洗牌(Shuffling Elements) 589
11.8.5 將元素嚮前搬(Moving Elements to the Front) 592
11.8.6 劃分為兩個子區間(Partition into Two Subranges) 594
11.9 排序算法(Sorting Algorithm) 596
11.9.1 對所有元素排序 596
11.9.2 局部排序(Partial Sorting) 599
11.9.3 根據第 {itshape n} 個元素排序 602
11.9.4 Heap 算法 604
11.10 已序區間算法(Sorted-Range Algorithm) 608
11.10.1 查找元素(Searching Element) 608
11.10.2 閤並元素(Merging Elements) 614
11.11 數值算法(Numeric Algorithm) 623
11.11.1 運算後産生結果 623
11.11.2 相對數列和絕對數列之間的轉換 627
12 特殊容器 631
12.1 Stack(堆棧) 632
12.1.1 核心接口 633
12.1.2 Stack 運用實例 633
12.1.3 一個用戶自定義的 Stack Class 635
12.1.4 細究 Class stack<> 637
12.2 Queue(隊列) 638
12.2.1 核心接口 639
12.2.2 Queue 運用實例 640
12.2.3 一個用戶自定義的 Queue Class 641
12.2.4 細究 Class queue<> 641
12.3 Priority Queue(帶優先級的隊列) 641
12.3.1 核心接口 643
12.3.2 Priority Queue 運用實例 643
12.3.3 細究 Class priority_queue<> 644
12.4 細究 Container Adapter 645
12.4.1 類型定義 645
12.4.2 構造函數(Constructor) 646
12.4.3 Priority Queue 額外提供的構造函數 646
12.4.4 各項操作(Operation) 647
12.5 Bitset 650
12.5.1 Bitset 運用實例 651
12.5.2 細究 Class bitset 653
13 字符串 655
13.1 String Class 的目的 656
13.1.1 例一:提煉臨時文件名 656
13.1.2 例二:提煉單詞並反嚮打印 660
13.2 String Class 細節描述 663
13.2.1 String 的各種相關類型 663
13.2.2 操作函數概覽 666
13.2.3 構造函數和析構函數(Constructor and Destructor) 667
13.2.4 String 和 C-String 668
13.2.5 大小和容量(Size and Capacity) 669
13.2.6 元素訪問(Element Access) 671
13.2.7 比較(Comparison) 672
13.2.8 更改內容(Modifier) 673
13.2.9 子字符串(Substring)及字符串接閤(String Concatenation) 676
13.2.10 I/O 操作符 677
13.2.11 搜索和查找(Searching and Finding) 678
13.2.12 npos的意義 680
13.2.13 數值轉換(Numeric Conversion) 681
13.2.14 String 對迭代器的支持 684
13.2.15 國際化(Internationalization) 689
13.2.16 效率(Performance) 692
13.2.17 String 和 Vector 692
13.3 細究 String Class 693
13.3.1 類型定義和靜態值 693
13.3.2 創建、復製、銷毀(Create, Copy, and Destroy) 694
13.3.3 大小和容量(Size and Capacity) 696
13.3.4 比較(Comparison) 697
13.3.5 字符訪問 699
13.3.6 産生 C-String 和字符數組(Character Array) 700
13.3.7 “改動”之相關操作(Modifying Operation) 700
13.3.8 查找(Searching and Finding) 708
13.3.9 子字符串(Substring)及字符串接閤(String Concatenation) 711
13.3.10 I/O函數 712
13.3.11 數值轉換(Numeric Conversion) 713
13.3.12 生成 Iterator 714
13.3.13 對 Allocator 的支持 715
14 正則錶達式 717
14.1 Regex 的匹配和查找接口(Match and Search Interface) 717
14.2 處理“次錶達式”(Subexpression) 720
14.3 Regex Iterator 726
14.4 Regex Token Iterator 727
14.5 用於替換的正則錶達式 730
14.6 Regex Flag 732
14.7 Regex 的異常(Exception) 735
14.8 Regex ECMAScript 文法 738
14.9 其他文法 739
14.10 細究 Basic Regex 簽名式 740
15 以 Stream 完成 I/O 743
15.1 I/O Stream 的共通基礎(Common Background) 744
15.1.1 Stream 對象 744
15.1.2 Stream Class 744
15.1.3 全局的 Stream 對象 745
15.1.4 Stream 操作符 745
15.1.5 操控器(Manipulator) 746
15.1.6 一個簡單例子 746
15.2 基本 Stream Class 和其對象 748
15.2.1 Class 及其層次體係 748
15.2.2 全局性的 Stream 對象 751
15.2.3 頭文件 752
15.3 標準的 Stream 操作符<<和>> 753
15.3.1 Output 操作符<< 753
15.3.2 Input 操作符>> 754
15.3.3 特殊類型的 I/O 755
15.4 Stream 的狀態(State) 758
15.4.1 錶示“ Stream 狀態”的常量 758
15.4.2 用來“處理 Stream 狀態”的成員函數 759
15.4.3 Stream 狀態與 Boolean 條件測試 760
15.4.4 Stream 的狀態和異常 762
15.5 標準 I/O 函數 767
15.5.1 Input 相關函數 768
15.5.2 Output 相關函數 771
15.5.3 實例 772
15.5.4 sentry對象 772
15.6 操控器(Manipulator) 774
15.6.1 操控器概覽 774
15.6.2 操控器如何運作 776
15.6.3 用戶自定義的操控器 777
15.7 格式化(Formatting) 779
15.7.1 Format Flag(格式標誌) 779
15.7.2 Boolean 的 I/O 格式 781
15.7.3 欄位寬度、填充字符、位置調整 781
15.7.4 正號與大寫 784
15.7.5 數值基底(Numeric Base) 785
15.7.6 浮點數(Floating-Point)錶示法 787
15.7.7 一般格式(General Formatting)定義 789
15.8 國際化(Internationalization) 790
15.9 文件訪問(File Access) 791
15.9.1 File Stream Class 791
15.9.2 File Stream 的 Rvalue 和 Move 語義 795
15.9.3 File Flag(文件標誌) 796
15.9.4 隨機訪問(Random Access) 799
15.9.5 使用文件描述器(File Descriptor) 801
15.10 為 String 而設計的 Stream Class 802
15.10.1 String Stream Class 802
15.10.2 String Stream 的 Move 語義 806
15.10.3 char* Stream Class 807
15.11 “用戶自定義類型”之 I/O 操作符 810
15.11.1 實現一個 Output 操作符 810
15.11.2 實現一個 Input 操作符 812
15.11.3 以輔助函數完成 I/O 814
15.11.4 用戶自定義之 Format Flag(格式標誌) 815
15.11.5 用戶自定義 I/O 操作符的規約(Convention) 818
15.12 連接 Input 和 Output Stream 819
15.12.1 以tie()完成鬆耦閤(Loose Coupling) 819
15.12.2 以 Stream 緩衝區完成緊耦閤(Tight Coupling) 820
15.12.3 將標準 Stream 重定嚮(Redirecting) 822
15.12.4 可讀可寫的 Stream 824
15.13 Stream Buffer Class 826
15.13.1 Stream 緩衝區接口 826
15.13.2 Stream 緩衝區的 Iterator 828
15.13.3 用戶自定義之 Stream 緩衝區 832
15.14 關於效能(Performance) 844
15.14.1 與 C 標準串流同步(Synchronization with C's Standard Streams) 845
15.14.2 Stream 緩衝區內的緩衝機製 845
15.14.3 直接使用 Stream 緩衝區 846
16 國際化 849
16.1 字符編碼和字符集 850
16.1.1 多字節(Multibyte)和寬字符(Wide-Character)文本 850
16.1.2 不同的字符集 851
16.1.3 在 C++ 中處理字符集 852
16.1.4 Character Trait 853
16.1.5 特殊字符的國際化 857
16.2 Locale(地域)概念 857
16.2.1 使用 Locale 858
16.2.2 Locale Facet 864
16.3 細究 Locale 866
16.4 細究 Facet 869
16.4.1 數值格式化(Numeric Formatting) 870
16.4.2 貨幣符號格式化(Monetary Formatting) 874
16.4.3 時間和日期格式化(Time and Date Formatting) 884
16.4.4 字符的分類和轉換 891
16.4.5 字符串校勘(String Collation) 904
16.4.6 消息國際化(Internationalized Message) 905
17 數值 907
17.1 隨機數及分布(Random Number and Distribution) 907
17.1.1 第一個例子 908
17.1.2 引擎(Engine) 912
17.1.3 細說引擎(Engine) 915
17.1.4 分布(Distribution) 917
17.1.5 細說分布(Distribution) 921
17.2 復數(Complex Number) 925
17.2.1 Class complex<>一般性質 925
17.2.2 Class complex<>運用實例 926
17.2.3 復數的各項操作 928
17.2.4 細說 Class complex<> 935
17.3 全局數值函數(Global Numeric Function) 941
17.4 Valarray 943
18 並發 945
18.1 高級接口:async()和 Future 946
18.1.1 async()和 Future 的第一個用例 946
18.1.2 實例:等待兩個 Task 955
18.1.3 Shared Future 960
18.2 低層接口:Thread 和 Promise 964
18.2.1 Class std::thread 964
18.2.2 Promise 969
18.2.3 Class packaged_task<> 972
18.3 細說啓動綫程(Starting a Thread) 973
18.3.1 細說async() 974
18.3.2 細說 Future 975
18.3.3 細說 Shared Future 976
18.3.4 細說 Class std::promise 977
18.3.5 細說 Class std::packaged_task 977
18.3.6 細說 Class std::thread 979
18.3.7 Namespace this_thread 981
18.4 綫程同步化與 Concurrency(並發)問題 982
18.4.1 當心 Concurrency(並發) 982
18.4.2 Concurrent Data Access 為什麼造成問題 983
18.4.3 什麼情況下可能齣錯 983
18.4.4 解決問題所需要的性質(Feature) 987
18.5 Mutex 和 Lock 989
18.5.1 使用 Mutex 和 Lock 989
18.5.2 細說 Mutex 和 Lock 998
18.5.3 隻調用一次 1000
18.6 Condition Variable(條件變量) 1003
18.6.1 Condition Variable(條件變量)的意圖 1003
18.6.2 Condition Variable(條件變量)的第一個完整例子 1004
18.6.3 使用 Condition Variable(條件變量)實現多綫程 Queue 1006
18.6.4 細說 Condition Variable(條件變量) 1009
18.7 Atomic 1012
18.7.1 Atomic 用例 1012
18.7.2 細說 Atomic 及其高級接口 1016
18.7.3 Atomic 的 C-Style 接口 1019
18.7.4 Atomic 的低層接口 1019
19 分配器 1023
19.1 以應用程序開發者的角度使用 Allocator 1023
19.2 用戶自定義的 Allocator 1024
19.3 以程序庫開發者的角度使用 Allocator 1026
參考書目 1031
新聞組及論壇( Newsgroup and Forum ) 1031
書籍和網站 1032
索引 1037
· · · · · · (
收起)