2013-12-29 10:40:54
5、Standard Template Library
5.1 STL組件(STL Components)
-
容器Containers,用來管理某類物件的集合。
-
迭代器Iterators,用來在一個物件群集(collection of objects)的元素上進行巡訪動作。
這個物件群集或許是個容器,或許是容器的一部分。
-
演算法Algorithms,用來處理群集內的元素。它們可以出於不同的目的而搜尋、排序、修改、使用那些元素。
5.2 容器(Containers)
總的來說,容器可分為兩類:
-
序列式容器Sequence containers,此乃可序(ordered)群集。
STL提供三個定義好的序列式容器:vector, deque, list。
-
關聯式容器Associative containers,此乃已序(sorted)群集。
STL提供了四個關聯式容器:set, multiset, map,multimap。
自動排序帶來的主要優點是,當你搜尋元素時,可獲得更佳效率。
5.2.1 序列式容器(Sequence Containers)
STL內部預先定義好以下三個序列式容器:
-
Vectorsz
-
Dequesz
-
Lists
此外你也可以將strings和array當作一种種序列式容器。
Vectors
Vector將其元素置於一個dynamic array中加以管理。
它允許隨機存取,也就是說你可以利用索引直接存取任何一個元素。
vector 並未提供push_front(),因為其時間效能很差(在vector頭端安插一個元素,需要移動全部元素)。
Deques(double-ended queue)
它是一個dynamic array,可以向兩端發展,因此不論在尾部或頭部安插元素都十分迅速。
Lists
List由雙向串列(doubly linked list)實作而成。這意味list內的每個元素都以一部分記憶體指示其前導元素和後繼元素。
List不提供隨機存取,因此如果你要存取第10個元素,你必須沿著串鏈依次走過前9個元素。
不過,移動至下一個元素或前一個元素的行為,可以在常數時間內完成。
List的優勢是:在任何位置上執行安插或刪除動作都非常迅速,因為只需改變連結(links)就好。
這表示在list中間位置移動元素比在vector和deque快得多。
5.2.2 關聯式容器(Associative Containers)
關聯式容器依據特定的排序準則,自動為其元素排序。排序準則以函式形式呈現,用來比較元素值(value)或元素鍵(key)。
-
Sets
Set的內部元素依據其值自動排序,每個元素值只能出現一次,不允許重複。
-
Multisets
Multiset和set相同,只不過它允許重複元素,也就是說multiset可包括多個數值相同的元素。
-
Maps
Map的元素都是「實值/鍵值」所形成的一個對組(key/valuepairs)。每個元素有一个個鍵,是排序準則的基礎。
每一個鍵只能出現一次,不允許重複。Map可被視為關聯式陣列(associative array),也就是具有任意索引型別(index type)的陣列(詳見p91)。
-
Multimaps
Multimap和map相同,但允許重複元素,也就是說multimap可包含多個鍵值(key)相同的元素。Multimap可被當作「字典」(譯註:dictionary,某種資料結構)使用。
p209有個範例。