C++——STL容器
序列式容器:vector,list,deque;stack,queue(容器介面卡),heap,priority_queue,slist
關聯式容器:(底層都是紅黑樹)set,map,multiset,multimap,hashtable,hash_set,hash_map,hash_multiset,hash——multimap
綜合對比:
array | vector | list | deque | |
儲存空間 | 靜態 | 動態 | 動態 | 動態分段連續空間 (沒用容量的概念)
|
迭代器 | 普通指標+,-,++,--,+=,-=,->,* | 節點(向前指標,向後指標,資料) | 非普通指標,非常複雜 故非必要不要用deque |
|
資料結構 | 單向開口的線性連續空間(頭部也可以插入,但操作效率低,無法接受) | 非連續空間,靠每個元素點的前後指標來串聯起來——雙向連結串列,甚至是雙向環形連結串列 | 雙向開口的線性連續空間(頭尾均可插入、刪除元素) star,finish兩個迭代器, map指標, map大小 |
|
空間增加 | 1.原大小的2倍增加空間; 2.拷貝原空間內容並構造新元素 3.釋放原空間 4.指向原vector的迭代器失效,要小心 |
插入一個元素,配置一個空間; 刪除一個元素,釋放一個空間 |
隨時增加新的分段空間並連線起來 沒有空間保留 |
|
任意位置插入資料 | 見下圖1 | 插入,貼合,刪除任意元素不會對其他元素/迭代器造成任何影響 | 操作複雜 |
選擇原則:
1、如果你需要高效的隨機存取,而不在乎插入和刪除的效率,使用vector
2、如果你需要大量的插入和刪除,而不關心隨機存取,則應使用list
3、如果你需要隨機存取,而且關心兩端資料的插入和刪除,則應使用deque。
4、如果你要儲存一個數據字典,並要求方便地根據key找value,那麼map是較好的選擇
5、如果你要查詢一個元素是否在某集合記憶體中,則使用set儲存這個集合比較好
一、vector:簡單,允許隨機儲存,資料的存取十分靈活,在預設情況下應該使用。
二、deque:經常在頭部和尾部安插和移除元素,並且儲存的容量也比vector大得多。
三、list:如果經常在容器的中段執行安插,移除和移動元素。但是不支援隨機儲存。 list容器中儘量不要使用刪除操作,比插入操作多消耗近百倍
四、set和multiset:經常以某個準則尋找元素,可以使用“以這個準則為排序準則”的set和multiset,在大量的資料情況下,對數複雜度比線性複雜度的效果要好的多。
五、map和multimap:使用(key、value)的pair,使用字典,使用關聯式陣列 e.g“map[key] = value”。
迭代器:類別、前進、後退、成員訪問、取值dereference(*操作符)
1.序列式容器
1.1 vector
插入資料操作:
圖1 Vector任意位置插入資料
1.2 list
1.3 deque
2.容器介面卡
2.1 stack(棧,垛)先進,後出
1 繼承自deque(封閉頭部開口)——更像一個adapter而不是container
2 新增、移除、獲得頂端資料,除此之外,無法獲得其他資料。
3 沒有迭代器
4 deque、list都可以作為底層容器
2.2 queue(佇列)
1 新增、移除,從尾端加入元素,從首端取出資料,此外,無法獲得其他資料。不允許遍歷
2 SGI STL 以deque為底部容器,封閉其前端入口和後端出口,前端只允許出,後端只允許入,即為queue
3 沒有迭代器
3.關聯性容器
單旋轉和雙旋轉操作:
對1和4用單旋轉操作,2和3用雙旋轉操作
單旋轉:
雙旋轉:
3.1 紅黑樹
規則:
1. 節點:顏色,父節點指標,左右節點指標,值
2. 迭代器:基本迭代器和繼承的迭代器兩層組成
3. 插入操作:1. 插入值:——對比節點鍵值(遇大往左,遇小往右)——得到新值的插入點、父節點——插入值(維護leftmost和rightmost,設定父節點、左右子節點)
2. 更新樹:更改顏色,旋轉樹使其平衡
3.2 Set
1.元素的鍵值就是實值
2.值自動排序
3.不允許相同的值
4.底層是紅黑樹
3.3 map
1.所有的元素都是鍵值和實值的pair
2.不允許相同鍵值
3.鍵值自動排序
4.底層是紅黑樹
3.3 multiset
set(insert_unique)+允許鍵值重複:insert_equal
3.4 multimap
map(insert_unique)+允許鍵值重複:insert_equal
4.hashtable
參考:
原文:https://blog.csdn.net/u013299585/article/details/78323973
https://blog.csdn.net/caojunhao123/article/details/11907857