STL各種數據結構及其底層實現
- vector:底層數據結構爲數組 ,支持快速隨機訪問 。擴容規則爲:當我們新建一個vector的時候,會首先分配給他一片連續的內存空間,如
std::vector<int> vec
,當通過push_back向其中增加元素時,如果初始分配空間已滿,就會引起vector擴容,其擴容規則在gcc下以2倍方式完成:首先重新申請一個2倍大的內存空間;然後將原空間的內容拷貝過來;最後將原空間內容進行釋放,將內存交還給操作系統。根據vector的插入和刪除特性,以及擴容規則,我們在使用vector的時候要注意,在插入位置和刪除位置之後的所有迭代器和指針引用都會失效,同理,擴容之後的所有迭代器指針和引用也都會失效。 - list: 底層數據結構爲雙向鏈表,支持快速增刪。
- deque:底層數據結構爲一箇中央控制器和多個緩衝區,詳細見STL源碼剖析P146,支持首尾(中間不能)快速增刪,也支持隨機訪問,deque是一個雙端隊列(double-ended queue),也是在堆中保存內容的.它的保存形式如下:[堆1] --> [堆2] -->[堆3] --> ...,每個堆保存好幾個元素,然後堆和堆之間有指針指向,看起來像是list和vector的結合品。
- stack:底層一般用list或deque實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時
- queue: 底層一般用list或deque實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時 ((stack和queue其實是適配器,而不叫容器,因爲是對容器的再封裝)
- priority_queue:底層數據結構一般爲vector爲底層容器,堆heap爲處理規則來管理底層容器實現。
- set:底層數據結構爲紅黑樹,有序,不重複
-
multiset: 底層數據結構爲紅黑樹,有序,可重複 (重複是指關鍵字重複)
-
map:底層數據結構爲紅黑樹,有序,不重複
-
multi:底層數據結構爲紅黑樹,有序,可重複
-
hash_set:底層數據結構爲hash表,無序,不重複
-
hash_multiset:底層數據結構爲hash表,無序,可重複
-
hash_map:底層數據結構爲hash表,無序,不重複
-
hash_multimap:底層數據結構爲hash表,無序,可重複