標籤:transform 隊列 類模板 vector ble 基本 map 術語 複製構造
泛型程式設計的基本概念
- 編寫不依賴於具體資料類型的程式
- 將演算法從特定的資料結構中抽象出來,成為通用的
- C++的模板為泛型程式設計奠定了關鍵的基礎
術語:概念
- 用來界定具備一定功能的資料類型。例如:
- 將“可以比大小的所有資料類型(有比較子)”這一概念記為Comparable
- 將“具有公有的複製建構函式並可以用‘=’賦值的資料類型”這一概念記為Assignable
- 將“可以比大小、具有公有的複製建構函式並可以用‘=’賦值的所有資料類型”這個概念記作Sortable
- 對於兩個不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能,那麼就說概念B是概念A的子概念。例如:
- Sortable既是Comparable的子概念,也是Assignable的子概念
術語:模型
- 模型(model):符合一個概念的資料類型稱為該概念的模型,例如:
- int型是Comparable概念的模型。
- 靜態數群組類型不是Assignable概念的模型(無法用“=”給整個靜態數組賦值)
用概念做模板參數名
- 很多STL的實現代碼就是使用概念來命名模板參數的。
- 為概念賦予一個名稱,並使用該名稱作為模板參數名。
例如
STL簡介
標準模板庫(Standard Template Library,簡稱STL)提供了一些非常常用的資料結構和演算法
STL簡介
- 標準模板庫(Standard Template Library,簡稱STL)定義了一套概念體系,為泛型程式設計提供了邏輯基礎
- STL中的各個類模板、函數模板的參數都是用這個體系中的概念來規定的。
- 使用STL的模板時,型別參數既可以是C++標準庫中已有的類型,也可以是自訂的類型——只要這些類型是所要求概念的模型。
STL的基本組件
- 容器(container)
- 迭代器(iterator)
- 函數對象(function object)
- 演算法(algorithms)
STL的基本組件間的關係
- Iterators(迭代器)是演算法和容器的橋樑。
- 將迭代器作為演算法的參數、通過迭代器來訪問容器而不是把容器直接作為演算法的參數。
- 將函數對象作為演算法的參數而不是將函數所執行的運算作為演算法的一部分。
- 使用STL中提供的或自訂的迭代器和函數對象,配合STL的演算法,可以組合出各種各樣的功能。
STL的基本組件——容器(container)
- 容納、包含一組元素的對象。
- 基本容器類模板
- 順序容器
- array(數組)、vector(向量)、deque(雙端隊列)、forward_list(單鏈表)、list(列表)
- (有序)關聯容器
- set(集合)、multiset(多重集合)、map(映射)、multimap(多重新對應)
- 無序關聯容器
- unorderedset (無序集合)、unorderedmultiset(無序多重集合)
- unorderedmap(無序映射)、unordermultimap(無序多重新對應)
- 容器適配器
- stack(棧)、queue(隊列)、priority_queue(優先隊列)
- 使用容器,需要包含對應的標頭檔
STL的基本組件——迭代器(iterator)
- 迭代器是泛化的指標,提供了順序訪問容器中每個元素的方法
- 提供了順序訪問容器中每個元素的方法;
- 可以使用“++”運算子來獲得指向下一個元素的迭代器;
- 可以使用“*”運算子訪問一個迭代器所指向的元素,如果元素類型是類或結構體,還可以使用“->”運算子直接存取該元素的一個成員;
- 有些迭代器還支援通過“--”運算子獲得指向上一個元素的迭代器;
- 迭代器是泛化的指標:指標也具有同樣的特性,因此指標本身就是一種迭代器;
- 使用獨立於STL容器的迭代器,需要包含標頭檔。
STL的基本組件——函數對象(function object)
- 一個行為類似函數的對象,對它可以像調用函數一樣調用。
- 函數對象是泛化的函數:任何普通的函數和任何重載了“()” 運算子的類的對象都可以作為函數對象使用
- 使用STL的函數對象,需要包含標頭檔
STL的基本組件——演算法(algorithms)
- STL包括70多個演算法
- 例如:排序演算法,消除演算法,計數演算法,比較演算法,變換演算法,置換演算法和容器管理等
- 可以廣泛用於不同的對象和內建的資料類型。
- 使用STL的演算法,需要包含標頭檔。
- 例10-1從標準輸入讀入幾個整數,存入向量容器,輸出它們的相反數
STL程式執行個體
transform演算法的一種實現:
template <class InputIterator, class OutputIterator, class UnaryFunction>OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op) { for (;first != last; ++first, ++result) *result = op(*first); return result;}
- transform演算法順序遍曆first和last兩個迭代器所指向的元素;
- 將每個元素的值作為函數對象op的參數;
- 將op的傳回值通過迭代器result順序輸出;
- 遍曆完成後result迭代器指向的是輸出的最後一個元素的下一個位置,transform會將該迭代器返回
本文內容參考自C++語言程式設計(第4版),鄭莉,清華大學出版社
C++ 泛型程式設計與STL模板庫(1)---泛型程式設計簡介及STL簡介與結構