1. 程式人生 > >STL各種資料結構及其底層實現

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