C++ 標準庫, 2/e The C++ Standard Library: A Tutorial and Reference, 2/e

Nicolai M. Josuttis 侯捷

買這商品的人也買了...

相關主題

商品描述

本書是全球 C++ 經典權威參考書籍時隔 12 年,基於 C++11 標準的全新重大升級。標準庫提供了一組公共類和接口,極大地拓展了 C++ 語言核心功能。《C++ 標準庫(第2版)》詳細講解了每一標準庫組件,包括其設計目的和方法、復雜概念的剖析、實用而高效的編程細節、存在的陷阱、重要的類和函數,又輔以大量用 C++11 標準實現的實用代碼範例。除覆蓋全新組件、特性外,本書一如前版,重點著眼於標準模板庫(STL),涉及容器、迭代器、函數對象以及 STL 算法。此外,本書同樣關註 lambda 表達式、基於區間的for循環、move語義及可變參數模板等標準庫中的新式 C++ 編程風格及其影響。

作者簡介

尼古拉・約祖蒂斯,獨立技術顧問,曾為電信、交通、金融和製造業設計過大中型軟件系統。
他還是C++標準委員會工作組早期成員,並因撰寫的權威C++圖書而享有盛名。
除1999年出版的本書第1版(享譽全球的C++暢銷圖書)外,他還是《C++ Templates: The Complete Guide》和《SOA實踐指南:分佈式系統設計的藝術》的作者。


侯捷,海峽兩岸著名的電腦技術自由作家,對於技術的鑽研和發表,有獨特的品性與堅持。
作品涵蓋著、譯、評三方面,散見於各種刊特、媒體、網站論壇,深受讀者喜愛和尊敬。

目錄大綱

目錄

第2版譯序xxi
第2版序言xxiii
第2版致謝xxiv
第1版序言xxv
第1版致謝xxv​​i

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 Collat​​ion) 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