文章目錄
- 1、Vector
- 2、List
- 3、Deque
- 4、Stack
- 5、Queue
- 6、heap
- 7、Priority Queue
stl裡的容器按元素在容器內的相片順序,可以分為序列式和關聯式兩種。
所謂序列式容器,其中的元素時可序的,即元素集合呈線性關係。
C++本身提供了一個序列式容器array,stl提供了vector,list,deque,stack,queue,priority_queue等序列容器。其中stack和queue由於只是將deque蓋頭換面,在技術上稱之為適配器。
1、Vector
vector的元素儲存和訪問方式和array很相似,唯一的不同就在於彈性。array是靜態空間,一旦配置了就不能改變;vector是動態空間,隨著元素的增多或減少,其配置空間的大小可以動態改變。
vector的迭代器:由於vector使用的是連續線性空間,所以其迭代器實際就是原生指標,這顯然是個Random Access Iterator。
空間配置策略:從效率考慮,當插入元素的時候,如果配置的空間不足,則擴充空間至當前的兩倍,如果任然不足則擴充至所需空間。 插入或刪除元素時,涉及元素的拷貝和初始化。
2、List
list是一個雙向鏈表,每次插入或刪除一個元素,就分配或釋放一個元素的空間;所以list對空間的控制十分精確,而且任何位置的插入或刪除需要的時間都是常數。list和vector是兩種最常用的容器,什麼時候選用哪種容器,視元素的多寡、元素的構造複雜度(是否有trivial copy ctor,assignment opt)以及元素存取的行為特性。
list的迭代器:list不能再以原生指標作為迭代器,而需要定義特定的iterator類。list迭代器是一種Bidirectional Iterator,支援單步的前進或後退操作。list迭代器有一個重要特點,就是插入操作不會造成原有迭代器的實效,這對vector是不成立的。
list的結構:list不僅是一個雙向鏈表,而且是一個帶頭結點的環狀雙向鏈表。
list的sort方法:list不能使用stl提供的通用sort演算法,因為sort演算法只接受Random Access Iterator,所以提供了自己的sort方法。sort方法的實現在另一篇中有描述。
3、Deque
vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾分別做元素的的安插和刪除操作;vector當然也可以在頭尾兩端做動作,但是其頭部動作效率奇差。deque和vector最大的差異在於:deque允許在常數時間內對兩端進行元素的安插或移除操作;deque沒有所謂容量的概念,因為它是以分段的連續空間組合而成,隨時可以增加一段空間拼接起來,不存在像vector那樣“因空間不足而分配一塊更大的空間然後複製元素”問題。
deque的迭代器:deque提供random access iterator,但並不是原生指標。其實現的複雜度也很大,這也影響到相關演算法的效率。所以如非必要,應該盡量使用vector而不是deque。對的確進行排序時,可以先將元素複製到一個vector,排序後再複製回deque。
deque的儲存結構:deque採用的是一種分段連續空間儲存結構,採用一個map(不是stl中的map)來管理這些空間段。每個空間段的大小是固定的,當有新元素加入而空間不足時,就分配一個新的空間段。當空間段的個數增加時,可能需要分配一個更大的map。 deque的這種結構,是的其迭代器上的操作可能需要跨越空間段,因而具有相當的複雜度。
4、Stack
stack是一種先進後出的資料結構,只可以在頂端進行元素操作。如果有某種雙向開口的資料結構,將其介面改變,符合“先進後出”的特性,就可以形成一個stack:deque和list都是這樣的結構。
因此stack的實現非常簡單,它以某種現有的容器作為儲存的實現,定義新的介面。這種容器被稱為container adapter。
template <class T, class Sequence=Deque<T> >
class stack
{
...
}
如上所示,stack預設使用deque來實現,你也可以使用list: stack<int, list<int> >;
stack不支援對元素的遍曆,因此沒有迭代器。
5、Queue
queue是一宗先進先出的資料結構,它的實現方案和stack基本一樣。也是屬於container adapter一類。可以基於deque和list。
queue沒有迭代器。
6、heap
heap並不是stl中的一種容器,它實際是以vector作為完全二叉樹的儲存結構,再加上一些heap演算法。它是priority_queue的背後英雄。
stl定義了一些heap操作的演算法:包括建堆,push_heap,pop_heap,sort_heap等,基本上和《演算法導論》堆排序一章介紹的一致。
7、Priority Queue
priority queue是一種擁有權值概念的queue,加入的元素按權值大小排列。priority_queue也是container adapter,它以vector為儲存結構,再以heap演算法進行處理:priority_queue的元素存放在一個vector當中,按元素權值排列成一個heap。
priority queue同樣沒有迭代器。