關於幾種數據結構:
vector(向量):
STL中標準而安全的數組。只可以在vector的“前面”增加數據。
deque(雙端隊列double-ended queue):
在功能上與vector相類似,但是可以在前後端向其中添加數據。
list(列表):
遊標以此只可以移動一步。如果對鏈表鏈表已經很熟悉,那麼STL中的list其實就是一個雙向鏈表(每個節點有指向前驅和指向後繼的兩個指針)。
set(集合):
包含了進過排序了的數據,這些數據的值(value)必須是唯一的。
map(映射):
經過排序了的二元組的集合,map中的每個元素都是由兩個值組成,其中的key(鍵值,一個map中的鍵值必須是唯一的)是在排序或者搜索時使用的,它的值可以在容器中獲取;而另一個值是該元素關聯的數值。比如,除了可以ar[43] = "overripe"這樣找到一個數據,map還可以通過ar[“banana”] = "overripe"這樣的方法找到一個數據。如果你想獲得其中的元素信息,通過輸入元素的全名就可以輕鬆實現。
multiset(多重集):
和集合(set)相似,然而其中的值不要求必須是唯一的(即可以有重複)。
multimap(多重映射):
和映射(map)相似,然而其中的鍵值不要求必須是唯一的(即可以有重複)。
STL之所以出名,不僅是因爲提供了像vector、string、list等方便的容器,更重要的,STL封裝了許多複雜的數據結構算法和大量常用數據結構操作:
vector封裝了數組
list封裝了鏈表
map和set封裝了二叉樹
在封裝這些數據結構的時候,STL按照程序員的使用習慣,以成員函數方式提供的常用操作,如:插入、排序、刪除、查找等。讓用戶在 STL使用過程中,並不會感到陌生。
紅黑樹
C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成爲RB樹(Red-Black Tree)。RB樹的統計性能要好於一般的平衡二叉樹,所以被STL選擇作爲了關聯容器的內部結構。
爲何map和set的插入刪除效率要比其他序列容器高?
簡單來說,因爲對於關聯容器而言,不需要做內存拷貝和內存移動。map和set容器內的所有元素都是以節點方式來存儲的,其節點結構和鏈表類似,指向父節點和子節點。
因此,在插入的時候只需要稍作變換,把節點的指針指向新的節點就可以了。刪除的時候類似,稍作變換後吧指向刪除節點的節點的指針指向其他的節點就可以了。
這其中,只涉及到指針的轉換,而沒有涉及到內存的移動。
基本總結
1.vector 底層數據結構爲數組 ,支持快速隨機訪問
2.list 底層數據結構爲雙向鏈表,支持快速增刪
3.deque 底層數據結構爲一箇中央控制器和多個緩衝區,詳細見STL源碼剖析P146,支持首尾(中間不能)快速增刪,也支持隨機訪問
deque是一個雙端隊列(double-ended queue),也是在堆中保存內容的.它的保存形式如下:
[堆1] --> [堆2] -->[堆3] --> ...
每個堆保存好幾個元素,然後堆和堆之間有指針指向,看起來像是list和vector的結合品.
4.stack 底層一般用list或deque實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時
5.queue 底層一般用list或deque實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時
(stack和queue其實是適配器,而不叫容器,因爲是對容器的再封裝)
6.priority_queue 的底層數據結構一般爲vector爲底層容器,堆heap爲處理規則來管理底層容器實現
7.set 底層數據結構爲紅黑樹,有序,不重複
8.multiset 底層數據結構爲紅黑樹,有序,可重複
9.map 底層數據結構爲紅黑樹,有序,不重複
10.multimap 底層數據結構爲紅黑樹,有序,可重複
11.hash_set 底層數據結構爲hash表,無序,不重複
12.hash_multiset 底層數據結構爲hash表,無序,可重複
13.hash_map 底層數據結構爲hash表,無序,不重複
14.hash_multimap 底層數據結構爲hash表,無序,可重複
參考文章:
STL中map、set的數據結構及底層實現
原文鏈接:https://blog.csdn.net/lym940928/article/details/88377649