【stl】序列式容器細節
一、概論
1、序列式容器
array(build-in) c++內建
vector
heap內含乙個vector
priority-queue內含乙個heap
list
slist
deque
stack內含乙個deque
queue內含乙個deque
2、關聯式容器
rb-tree
set內含乙個rb-tree
map內含乙個rb-tree
multiset內含乙個rb-tree
multimap內含乙個rb-tree
hashtable
hash_set內含乙個hashtable
hash_map內含乙個hashtable
hash_multiset內含乙個hashtable
hash_multimap內含乙個hashtable
3、所謂序列式容器,其中的元素都可序,但未必有序。
二、vector
1、vector的資料安排以及操作方式,與array非常相似,兩者的唯一差別在於空間的運用的靈活性。
array是靜態空間,一旦配置了就不能改變。
vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。
2、vector的實現技術,關鍵在於其對大小的控制以及重新配置時的資料移動效率。
3、vector提供random access iterator
4、vector的資料結構
線性連續空間
以兩個迭代器start和finish分別指向配置得來的連續空間中目前已經被使用的範圍,並以迭代器end_of_storage
指向整塊連續空間(含備用空間)的尾端。
當增加新元素時,如果超過當時的容量,則容量會擴充至兩倍。如果兩倍容量仍不足,則擴充至足夠大的容量。
容量大於等於其size。
容量的擴張必須經歷「重新配置、元素移動、釋放原空間」等過程,工程浩大。
5、vector的構造與記憶體管理
所謂動態增加大小,並不是在原空間之後接續新空間(因為無法保證原空間之後尚有可供配置的空間),而是以原大小的兩倍
另外配置一塊較大空間,然後將原內容拷貝過來,然後才開始在原內容之後構造新元素,並釋放原空間。
因此,對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了。
6、stl對於「插入操作」的標準規範:插入完成後,新節點將位於哨兵迭代器所指之節點的前方。
三、list
1、相較於vector的連續線性空間,list就顯得複雜許多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。
對於任何位置的元素插入或元素移除,list永遠是常數時間。
2、list的實現是乙個環狀雙向鍊錶,只需要乙個指標,便可以完整表現整個鍊錶。
只要刻意在環狀鍊錶的尾端加上乙個空白節點,便符合stl規範之「前閉後開」區間。
3、list提供 bidirectional iterator
四、deque
1、vector是單向開口的連續線性空間,而deque則是一種雙向開口的連續線性空間。所謂雙向開口,表示可以在頭尾兩端分別
做元素的插入和刪除操作。
2、deque和vector的最大差異:
a、deque允許常數時間內對頭端進行元素的插入或移除操作
b、deque沒有容量概念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈結起來。
3、deque也提供random access iterator,但複雜度很高,除非必要,盡可能選擇vector
4、deque的中控器
deque由一段一段的定量連續空間構成,deque採用一塊所謂的map作為主控,這裡的map是一小塊連續空間,其中每
個元素都是指標,指向另一段連續線性空間,稱為緩衝區。緩衝區才是deque的儲存空間主體。
5、deque的迭代器
deque是分段連續空間,維持其「整體連續」假象的任務,落在了迭代器的operator++和operator--運運算元身上。
每個緩衝區大小一樣。
五、stack
1、stack是filo的資料結構,只有乙個出口。
2、stack以deque為底部結構,因此stack往往不被歸類為container,而被歸類為container adapter
3、stack不提供走訪功能,也不提供迭代器。
六、queue
1、queue是fifo的資料結構,有兩個出口。
2、queue以deque為底部結構,因此queue往往不被歸類為container,而被歸類為container adapter
3、queue不提供遍歷功能,也不提供迭代器。
七、heap
1、heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue 的助手。
2、priority queue允許使用者以任何次序將任何元素推入容器內,但取出時一定是從優先順序最高的元素開始取。
3、binary heap是一種完全二叉樹,通過簡單的位置規則,array可以輕易實現出完全二叉樹,這種以array表述tree的方式,
我們稱為隱式表述法。
4、array的缺點是無法動態改變大小,而heap卻需要這項功能,因此,以vector代替array是更好的選擇。
5、heap不提供遍歷功能,也不提供迭代器。
6、經過排序後的heap不再是乙個合法的heap,需要再做乙個heap
八、priority queue
1、priority queue是乙個擁有權值觀念的queue,由於是queue,只允許在底端加入元素,並從頂端取出元素。
2、priority queue帶有權值觀念,其內的元素並非按照被推入的次序排列,而自動按元素的權值排列。
3、priority queue以vector為底部結構再加上heap處理規則,因此其往往不被歸類為container,而被歸類為container adapter
4、priority queue不提供遍歷功能,也不提供迭代器。
九、slist
1、slist是單向鍊錶,這個容器並不在標準規格之內。
2、slist的迭代器屬於forward iterator,而list的迭代器輸入bidirectional iterator
十、總結
序列式容器的重點在於vector、list、deque的理解,清楚了其內部實現,在實際中就可以應用得當。
STL序列式容器 heap
stl heap主要有以下幾種操作組成 make heap,建堆 sort heap,堆排序 pop heap,取出堆頂元素 push heap,調整堆 heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue的助手。binary max heap適合作為priority ...
STL序列式容器概述
stl容器分為序列式和關聯式兩種,序列式容器,其中的元素都可序,但未必有序 heap內含乙個vector,priority queue內含乙個heap,stack和queue都內含乙個deque 1.以vector為底層實現 1.1 vectorvector詳情 vector維護的是乙個連續線性空間...
STL之序列式容器 一 什麼是序列式容器
序列容器以線性序列的方式儲存元素。它沒有對元素進行排序,元素的順序和儲存它們的順序相同。一般來說,有 5 種標準的序列容器,每種容器都具有不同的特性 現在我們來說說序列式容器到底是什麼。所謂序列容器,即以線性排列 類似普通陣列的儲存方式 來儲存某一指定型別 例如 int double 等 的資料,需...