前言
歡迎學習《C++標準模板庫編程實戰》一書。本教程介紹了由
C++標準庫組成的頭檔案子集中所包含的一些類和函式的模板。這些模板是功能強大、易於使用的泛型編程工具,並使很多不容易實現的任務變得易於實現。它們生成的代碼通常比我們自己編寫的更加高效和可靠。
通常,筆者不喜歡只解釋它們做了些什麼,而不詳細論述這么做的原因。從前者是很難猜出後者的。因此筆者的目標不僅僅是解釋類和函式模板的功能,還會儘可能地展示如何在實際場景中套用它們。這會導致在某些知識點的介紹中包含相當大的代碼塊,但相信你會覺得它們是值得的。
之前提到的作為本書主題的來自於C++標準庫的頭檔案的集合,被稱作C++標準庫或STL。在本書中,會用STL作為一種方便的縮寫來表示包含本書所討論模板的頭檔案的集合。當然,並沒有STL這種東西——C++語言標準並沒有提到它,因此正規而言,它並不存在。儘管它並沒有被定義,但很多C++程式設計師都大致知道STL是什麼意思。這種叫法由來已久。
貫穿STL的泛型編程思想早在1979年起源於AlexanderStepanov——很久之前並沒有C++語言標準。C++的STL的第一個實現起源於Stepanov和其他在1989年前後工作於惠普公司的職員,而且在那時,STL的實現和C++編譯器所提供的庫是互補的。在20世紀90年代,STL提供的功能開始被考慮納入第一個C++語言標準的提議中,而且STL的精髓使它成為公布於1998年的第一個C++語言標準。從那時起,STL所代表的泛型編程開始被改進和擴展,並且很多不屬於STL的頭檔案中開始出現了模板。本書中的所有材料都和編寫本書時最新通過的語言標準相關,也就是C++14。
圖書簡介
《C++標準模板庫編程實戰》介紹最新的C++14標準的API、庫和擴展,以及如何將它們運用到C++14程式中。在書中,作者IvorHorton則闡述了什麼是STL,以及如何將它們套用到程式中。我們將學習如何使用容器、疊代器,以及如何定義、創建和套用算法。此外,還將學習函式對象和適配器,以及它們的用法。
閱讀完本書之後,你將能夠了解如何擴展STL,如何定義自定義類型的C++組件,你還將能夠定義既滿足C++STL要求又遵從最常見的設計模式和最佳實踐的自定義類型。
標準庫是C++標準的一個基本部分,它為C++程式設計師提供了一套全面而又高效的工具,還提供了一些適用於多種類型程式的可重用組件。
目錄
第1章STL介紹1
1.1基本思想2
1.2模板2
1.3容器6
1.4疊代器7
1.4.1獲取疊代器8
1.4.2疊代器的類別8
1.4.3流疊代器11
1.4.4疊代器適配器12
1.5疊代器上的運算14
1.6智慧型指針14
1.6.1使用unique_ptr<T>指針16
1.6.2使用shared_ptr<T>指針18
1.6.3weak_ptr<T>指針21
4.2map容器的用法132
4.2.1創建map容器134
4.2.2map元素的插入135
4.2.3在map中構造元素142
4.2.4訪問map中的元素142
4.2.5刪除元素152
4.3pair<>和tuple<>的用法152
4.3.1pair的操作153
4.3.2tuple的操作156
4.3.3tuples和pairs實戰158
4.4multimap容器的用法163
4.5改變比較函式168
4.5.1greater<T>對象的用法168
4.5.2用自定義的函式對象來比較
元素169
4.6哈希170
4.7unordered_map容器的用法173
4.7.1生成和管理unordered_map
容器175
4.7.2調整格子個數177
4.7.3插入元素178
4.7.4訪問元素179
4.7.5移除元素180
4.7.6訪問格子180
4.8unordered_multimap容器的
用法184
4.9本章小結192
練習193
第5章set的使用195
5.1理解set容器195
5.2使用set<T>容器196
5.2.1添加和移除元素197
5.2.2訪問元素199
5.2.3使用set199
5.2.4set疊代器209
5.2.5在set容器中保存指針209
5.3使用multiset<T>容器215
5.3.1保存派生類對象的指針217
5.3.2定義容器219
5.3.3定義示例的main()函式220
5.4unordered_set<T>容器223
5.4.1添加元素224
5.4.2檢索元素225
5.4.3刪除元素226
5.4.4創建格子列表227
5.5使用unordered_multiset<T>
容器228
5.6集合運算233
5.6.1set_union()算法234
5.6.2set_intersection()算法235
5.6.3set_difference()算法236
5.6.4set_symmetric_difference()
算法236
5.6.5includes()算法236
5.6.6集合運算的運用238
5.7本章小結240
練習240
第6章排序、合併、搜尋和分區243
6.1序列排序243
6.1.1排序以及相等元素的
順序246
6.1.2部分排序247
6.1.3測試排序序列250
6.2合併序列251
6.3搜尋序列260
6.3.1在序列中查找元素260
6.3.2在序列中查找任意範圍的
元素262
6.3.3在序列中查找多個元素264
6.4分區序列268
6.4.1partition_copy()算法270
6.4.2partition_point()算法271
6.5二分查找算法272
6.5.1binary_search()算法273
6.5.2lower_bound()算法274
6.5.3equal_range()算法274
6.6本章小結277
練習278
第7章更多的算法279
7.1檢查元素的屬性279
7.2序列的比較281
7.2.1查找序列的不同之處283
7.2.2按字典序比較序列286
7.2.3序列的排列287
7.3複製序列292
7.3.1複製一定數目的元素292
7.3.2條件複製292
7.4複製和反向元素順序296
7.5複製一個刪除相鄰重複元素的
序列297
7.6從序列中移除相鄰的重複
元素298
7.7旋轉序列299
7.8移動序列301
7.9從序列中移除元素303
7.10設定和修改序列中的
元素305
7.10.1用函式生成元素的值306
7.10.2轉換序列307
7.10.3替換序列中的元素310
7.11算法的套用311
7.12本章小結315
練習320
第8章生成隨機數321
8.1什麼是隨機數321
8.2機率、分布以及熵322
8.2.1什麼是機率322
8.2.2什麼是分布322
8.2.3什麼是熵324
8.3用STL生成隨機數324
8.3.1生成隨機數的種子325
8.3.2獲取隨機種子325
8.3.3種子序列326
8.4分布類329
8.4.1默認隨機數生成器329
8.4.2創建分布對象330
8.4.3均勻分布331
8.4.4常態分配342
8.4.5對數分布347
8.4.6其他和常態分配相關的
分布350
8.4.7抽樣分布351
8.4.8其他分布365
8.5隨機數生成引擎和生成器370
8.5.1線性同餘引擎371
8.5.2馬特賽特旋轉演算法
引擎372
8.5.3帶進位減法引擎372
8.6重組元素序列373
8.7本章小結374
練習375
第9章流操作377
9.1流疊代器377
9.1.1輸入流疊代器377
9.1.2輸出流疊代器381
9.2重載插入和提取運算符383
9.3對檔案使用流疊代器384