STL的底層實現機制

2021-08-21 06:14:33 字數 2275 閱讀 7021

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

容器有vector、list、deque、map、multimap、set和multiset,它們究竟有何區別,各自的優缺點是什麼,為了更好的揚長避短,提高程式效能,在使用之前需要我們了解清楚。

vector類似於c語言中的陣列,它維護一段連續的記憶體空間,具有固定的起始位址,因而能非常方便地進行隨機訪問,即 操作符,但因為它的記憶體區域是連續的,所以在它中間插入或刪除某個元素,需要複製並移動現有的元素。此外,當被插入的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體拷貝。值得注意的是,vector每次擴容為原來的兩倍,對小物件來說執行效率高,但如果遇到大物件,執行效率就低了。

list類似於c語言中的雙向鍊錶,它通過指標來進行資料的訪問,因此維護的記憶體空間可以不連續,這也非常有利於資料的隨機訪問,因而它沒有提供 操作符過載。

deque類似於c語言中的雙向佇列,即兩端都可以插入或者刪除的佇列。queue支援 操作符,也就是支援隨機訪問,而且跟vector的效率相差無幾。它支援兩端的操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率

也差不多。或者我們可以這麼認為,deque是vector跟list的折中。

map類似於資料庫中的1:1關係,它是一種關聯容器,提供一對一(c++

primer中文版中將第乙個譯為鍵,每個鍵只能在map中出現一次,第二個被譯為該鍵對應的值)的資料處理能力,這種特性了使得map類似於資料結構裡的紅黑二叉樹。

multimap類似於資料庫中的1:n關係,它是一種關聯容器,提供一對多的資料處理能力。

set類似於數學裡面的集合,不過set的集合中不包含重複的元素,這是和vector的第乙個區別,第二個區別是set內部用平衡二叉樹實現,便於元素查詢,而vector是使用連續記憶體儲存,便於隨機訪問。

multiset類似於數學裡面的集合,集合中可以包含重複的元素。

在實際使用過程中,到底選擇這幾種容器中的哪乙個,應該根據遵循以下原則:

1、如果需要高效的隨機訪問,不在乎插入和刪除的效率,使用vector;

2、如果需要大量的插入和刪除元素,不關心隨機訪問的效率,使用list;

3、如果需要隨機訪問,並且關心兩端資料的插入和刪除效率,使用deque;

4、如果打算儲存資料字典,並且要求方便地根據key找到value,一對一的情況使用map,一對多的情況使用multimap;

5、如果打算查詢乙個元素是否存在於某集合中,唯一存在的情況使用set,不唯一存在的情況使用multiset。

轉至

STL底層實現

1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 deque是乙個雙端佇列 double ended que...

stl的hashtable底層實現

hashtable在c 的stl裡佔據著比較重要的一席之地。其中的hash set hash map hash multiset hash multimap四個關聯容器都是以hashtable為底層實現方法 技巧 應該說,上述的四個關聯式容器提供的api都是對hashtable原生態api的高層封裝...

虛函式的底層實現機制

1 多型的實現機制 c 在基類中宣告乙個帶關鍵之virtual的函式,這個函式叫虛函式 它可以在該基類的派生類中被重新定義並被賦予另外一種處理功能。通過指向指向派生類的基類指標或引用呼叫虛函式,編譯器可以根據指向物件的型別在執行時決定呼叫的目標函式。這就實現了多型。2 例項 cpp view pla...