1. 程式人生 > >C++——STL容器

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