本書先在闡述泛型基本概念的基礎上,比較詳細和全面地介紹C++泛型實現的基本技術和基本機制,然后介紹STL的泛型實現技術及其應用方法。本書在內容選材及編寫上注意泛型以及STL初學者的特點,語言通俗易懂,精練而不枯燥;以仿真的方式介紹STL的核心內容,從而達到理論和應用并重的學習效果。
本書是一本理論和應用兼顧,適合泛型設計及STL初學者閱讀的讀物,鑒于它的特點,也適合作為在校計算機專業、軟件工程專業或與之相關專業的教材。
不止一次被問: 什么是泛型?什么是STL?泛型與STL有關系嗎?
泛型和STL不僅有關系,而且有很重要的關系: 泛型是一種設計思想,而STL則是泛型思想在C++上所取得的成果。
所謂泛型就是一種更抽象、更寬泛的數據類型,用術語來說就是參數化了的數據類型,通俗點說就是一種“通用”數據類型。泛型就是企圖使用這種“通用”類型來擺脫數據類型對代碼復用的限制,從而提高軟件開發效率。而C++則依靠它的模板技術實現了泛型思想,C++把常用的模板都制作成便于用戶應用的例程提供在模板類庫中,這個模板類庫就叫做STL(Standard Template Library)。所以可以這樣說: STL是泛型思想的C++實現。
泛型是不是很難?本科生有必要學習它嗎?
泛型并不難,它實質上是人們把計算機語言向人類語言發展的一個重要步驟。也就是說,泛型更接近人類語言,所以從應用的角度來說它一點都不難。但是,要想把泛型(在C++中就是模板及其應用技術)的工作機理弄明白也不是一件簡單的事情,因為一般人很少能直接接觸到數據類型的推導和處理這些以前全部由編譯器做的工作,除非他搞過系統軟件的設計。
那么本科生有必要學習它嗎?能把STL學明白嗎?
作者的回答是: 絕對有必要,因為它很有用,在各方面都很有用。
首先,STL極具應用價值,因為大量的常規數據結構的維護管理工作它都自動完成了,用戶可以把自己的精力完全集中于自己的業務邏輯上來,從而極大地提高應用程序的開發效率。
其次,由于STL是泛型設計的一個典型實現,而泛型設計又是軟件發展的一個重要方向,因此作為打基礎的本科學習階段,學生必須對泛型設計的相關概念及技術具有一定程度的了解。特別是學習C/C++語言程序設計之后,完全有必要讓學生在對面向對象和面向過程程序設計思想混合應用的STL進行一番設計思想的學習和體驗,從而從更深層次的角度看待上述兩個思想。
另外,從程序設計技術層面上看,STL不僅極具實用性,而其極具觀賞性,從而對學生也是一個工程美學的熏陶和訓練。
也有很多人問: 作為一個泛型庫(這里是STL)的使用者,用得著去學習和理解那些復雜的泛型機制和泛型技術嗎?這個問題不太好回答,因為泛型機制的形成以及泛型例程庫的建設都是圍繞著數據類型的處理展開的,并且數據類型的處理工作都是由編譯器完成的,故除非是進行泛型庫例程設計,否則作為泛型庫例程的使用者確實很少會直接接觸本書前兩章的內容。這跟開汽車一樣: 我只想開車上班,從來沒想過修汽車和造汽車,那么我有必要去學習汽車原理和制造技術嗎?當然,如果你與汽車這個行業無關,你可以這樣做,但如果你和汽車行業有關,而且很緊密,那么這個問題就見仁見智了。如果這個問題非得讓我回
答的話,那就是學一些為好,特別是在做學生的學習階段,因為在泛型技術中體現出了很多程序設計的思想。
總之,積作者數十年的經驗,作者認為本科生有必要學習泛型設計和STL。
本書是作者在泛型程序設計和STL教學多年經驗總結基礎上編撰而成一本教材。本書分為三部分: 第1~3章為第一部分;第4章為第二部分;第4~8章則為第三部分。
第一部分又分為兩個部分: 第1章和第2章是一部分;第3章單獨為一個部分。在第1章和第2章介紹泛型的概念,C++泛型技術基礎以及機制基礎,這部分內容大致屬于STL庫代碼設計范疇,是理解及將來進一步研究C++泛型的重要基礎。由于這部分比較偏向理論,所以為了便于初學者掌握,采取了用實際代碼引領理論的講解方式,并兼顧與前期學習的C/C++的平滑過渡,特別適合本科生學習。第3章則在前兩章的基礎上介紹STL及其與C/C++之間的關系,然后重點復習STL所使用的除了模板之外的C++技術,并以此為基礎介紹這些技術在STL的應用,從而與第1章與第2章共同形成學習STL的基礎。
第4章雖然只是一章,但其地位卻非常重要,是本書的“眼”,它實現了從泛型理論到C/C++泛型實現的過渡。第4章從STL的六大基礎部件之中,把最重要的容器、迭代器和通用算法提取出來,并將它們作為STL“三大件”進行單獨的仿真設計。其目的是使學生通過仿真從代碼實現的層次上理解泛型及泛型的意義,同時在學習C/C++程序設計之后在教材和教師的帶領之下,進行這種規模比較大的程序設計對學生也是一個極好的訓練,特別是迭代器的設計中所遵循的思想及其采用的設計技術,都會使學生受益匪淺。
從第5章開始便進入本書的第三部分,這部分主要就是對STL部件應用的介紹和講解,操作內容明顯變多。但需要注意的是,通用算法、適配器和容器內存空間配置器的介紹還是接觸了一些理論性內容的。
本書是一本理論和應用兼顧,為泛型設計及STL初學者閱讀的讀物,鑒于它的特點,也適合作為在校計算機專業、軟件工程專業或與之相關專業的教材。
本書的作者為任哲、房紅征和張永忠,任哲負責全書統稿工作。
在本書的編寫過程中,作者參閱了大量的參考文獻及網上資料,并引用了一些相關文字和例程,在此謹向這些文獻與資料的作者表示衷心的謝意。
由于作者水平有限,盡管很努力,但書中一定還會有很多錯誤和不盡如人意之處,在此敬請各位讀者指出并不吝賜教,作者將不盡感謝。
最后,祝各位讀者學習進步。
作者2015年12月
第1章C++泛型技術基礎——模板/1
1.1泛型與模板/1
1.1.1泛型的基本概念/1
1.1.2C++模板及其定義/3
1.1.3幾點說明和小結/7
1.2關于模板參數/10
1.2.1模板參數的種類/10
1.2.2模板形參和實參的結合/14
1.3特化模板和模板具現規則/16
1.3.1特化(特例化)模板/16
1.3.2模板的具現/19
1.4右值引用與模板/22
1.4.1右值引用/22
1.4.2右值引用的應用1——轉移
語義/25
1.4.3右值引用應用2——轉移函數
move()/30
1.4.4右值引用應用3——參數完美轉發
模板/31
第2章C++泛型機制的基石——數據類型表/39
2.1類模板的公有數據類型成員/39
2.1.1類的數據類型成員/39
2.1.2再談typedef/41
2.2內嵌式數據類型表及數據類型衍生/42
2.3數據類型表/44
2.3.1數據類型表的概念/44
2.3.2數據類型表的應用/47
2.4特化數據類型表/51
2.5STL中的Traits表/54
第3章STL及其使用的其他C++技術/61
3.1初識STL/613.1.1STL是C++標準庫中的模板
類庫/61
3.1.2STL應用程序示例/61
3.2STL常用的C++技術/65
3.2.1運算符重載/66
3.2.2函數對象(仿函數)/72
3.2.3lambda表達式/74
3.3智能指針/80
3.3.1智能指針的基本原理/81
3.3.2C++11支持的智能指針/86
第4章模擬STL三大件/90
4.1容器/90
4.1.1向量vector的仿真MyVector/90
4.1.2列表list的仿真MyList/95
4.2迭代器/101
4.2.1使用裸指針作為迭代器/102
4.2.2迭代器是指針的類封裝/105
4.2.3迭代器的代碼隔離作用/112
4.2.4STL迭代器的種類/115
4.2.5迭代器的種類標記/116
4.2.6STL對迭代器的管理/122
4.3通用算法/125
第5章容器及其應用/134
5.1向量vector/134
5.2列表list/141
5.3雙向隊列deque/144
5.4STL關聯式容器/148
5.5map容器/152
5.5.1map容器的定義/152
5.5.2map的數據插入/156
5.5.3map容器的其他常用成員
方法/160
5.5.4multimap容器/164
5.6set容器/165
5.7hash表基礎及hash容器/167
5.7.1hash表基礎/167
5.7.2hash容器/168
第6章通用算法/171
6.1通用算法的參數/171
6.1.1算法的迭代器參數/171
6.1.2輔助參數/179
6.1.3謂詞參數/180
6.2算法時間復雜度/188
6.3常用通用算法/189
6.3.1查找和搜索算法/189
6.3.2變異算法/202
6.3.3排序算法/226
6.3.4算術算法與關系算法/241
6.3.5排列組合與集合算法/252
第7章適配器模式在STL基礎部件上的應用/256
7.1適配器/256
7.2STL容器適配器/258
7.2.1stack適配器/259
7.2.2queue適配器/264
7.2.3priority_queue適配器/265
7.3迭代器適配器/275
7.3.1插入迭代器/275
7.3.2反向迭代器/280
7.3.3IO流迭代器/284
7.4函數對象適配器/291
7.4.1函數對象的適配/291
7.4.2函數對象配接器/294
第8章STL容器內存空間配置器/302
8.1內存空間配置器及其設計基礎/302
8.1.1什么是內存空間配置器/302
8.1.2內存空間配置器設計基礎/303
8.2STL空間配置器接口/307
8.2.1STL空間配置器接口及最簡單
的空間配置器/307
8.2.2典型STL容器空間的配置/311
8.3內存池的概念及應用/321
8.3.1內存池的規劃/321
8.3.2內存池的設計/323
附錄A關于關鍵字explicit/338