STL中常用容器的數據結構與底層實現

關於幾種數據結構:


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

https://blog.csdn.net/gx262091291/article/details/76737171

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章