C STL 的底層資料結構

2021-10-23 05:18:37 字數 1172 閱讀 5665

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表,無序,可重複

關聯容器(set,map)來說,不需要做記憶體拷貝和記憶體移動,故插入刪除效率比用其他序列容器高。

記憶體分配演算法:

查閱相關資料後,知道stl的優勢並不在於演算法,而在於記憶體碎片。如果你需要經常自己去new一些節點,當節點特別多,而且進行頻繁的刪除和插入的時候,記憶體碎片就會存在,而stl採用自己的allocator分配記憶體,以記憶體池的方式來管理這些記憶體,會大大減少記憶體碎片,從而會提公升系統的整體效能。當時間執行很長時間後(例如後台服務程式),map的優勢就會體現出來。從另外乙個方面講,使用map會大大降低你的編碼難度,同時增加程式的可讀性。

redis set底層資料結構

redis的集合物件set的底層儲存結構特別神奇,我估計一般人想象不到,底層使用了intset和hashtable兩種資料結構儲存的,intset我們可以理解為陣列,hashtable就是普通的雜湊表 key為set的值,value為null 是不是覺得用hashtable儲存set是一件很神奇的事...

C vector底層資料結構

vector 其底層資料結構是陣列,由於陣列的特點,vector也具有以下特性 1 o 1 時間的快速訪問 2 順序儲存,所以插入到非尾結點位置所需時間複雜度為o n 刪除也一樣 3 擴容規則 當我們新建乙個vector的時候,會首先分配給他一片連續的記憶體空間,如std vector vec,當通...

Redis底層資料結構?

福哥口訣法 簡鏈字跳整 壓快壓 sds synamic string 簡單動態字串。支援自動動態擴容的位元組陣列 list 鍊錶 雙端鍊錶。dict 字典。使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 跳躍表。附加了後向指標的跳躍表 intset 整數集合。用於儲存整數數值集合的自有結...