STL個各個容器的內部實現

2021-09-26 03:38:52 字數 2134 閱讀 9717

連續空間(像陣列一樣),只能向尾端插入,空間可以增長,空間增長是乙個非常好效能的事

增長三部曲:

另覓更大空間

將原資料複製過去

釋放原空間三部曲

環形雙向鍊錶

deque空間是分段連續,給人造成一種連續的假象,每乙個元素都是指標,指向另外一段真正連續的空間(稱作緩衝區),緩衝區才是真正存放資料的地方,

因為他是分段連續的,所以前進和後退,迭代器要做的工作比vector更複雜

關聯容器*********************************************==

二叉搜尋樹:任何結點大於左子樹,小於右子樹,

平衡二叉搜尋樹:查詢的時間在(logn)

紅黑樹:規則如下

每個結點不是紅色就是黑色

根結點是黑色

紅色結點的子結點是黑色

任意結點到葉子結點的任何路徑都必須含有相同黑色結點。

為什麼叫關聯二字:因為平衡二叉樹的每個結點都和其它結點相互影響,插入和刪除會該樹的形狀。每一元素都是特殊的唯一的。

任何插入的元素都會被自動排序,

我們可以通過set的迭代器改變set的元素值嗎?不行,因為set元素值就是其鍵值,關係到set元素的排列規則。如果任意改變set元素值,會嚴重破壞set組織。

multiset和multimap都允許有相同的key,multimap 不支援下標運算子,因為鍵並不能確定乙個唯一元素。

每一key對應乙個value,所有元素都會根據元素的鍵值自動被排序,map不允許兩個元素擁有相同的鍵值,而且不能修改key。

由於紅黑樹自動排序的效果不錯,所以map由紅黑樹構成(不是網上所說的由雜湊表構成,也許他是把所有關於對映方面的東西都認為是雜湊表,而這裡僅僅是給key賦乙個值),

unordered_set

unordered_set基於雜湊表,資料插入和查詢的時間複雜度很低,幾乎是常數時間,而代價是消耗比較多的記憶體,無自動排序功能。底層實現上,使用乙個下標範圍比較大的陣列來儲存元素,形成很多的桶,利用hash函式對key進行對映到不同區域進行儲存。

unordered_set可以把它想象成乙個集合,它提供了幾個函式讓我們可以增刪查:

unordered_set::insert

unordered_set::find

unordered_set::erase

容器介面卡*********************************************==

以某種既有容器做底部,改變對外的介面

不允許有遍歷行為,在預設的情況下以deque為內部結構,沒有迭代器,只能先進先出,

在預設的情況下以deque為內部結構

允許使用者以任何次序將任何元素推入容器內,但取出時一定是從優先權最高(也就是數值最高)的元素開始取。

內部用完全二叉樹構成,乙個vector和一組heap演算法(用來插入元素、刪除元素、取極值,將某一整組資料排列成乙個heap)。

vector有陣列的特效,還可以動他改變空間大小,

完全二叉樹,有大根數和小根數(每個結點小於或等於其子節點,左右子節點之間沒有關係)

如何插入?

把新元素插人在底層vector的end()處,如果位置不合適再往上互換位置,

list是雙向鍊錶,slist是單向鍊錶,但是這個不在stl標準中

STL常用容器內部實現

stl是c c 開發中乙個非常重要的模板,而其中定義的各種容器也是非常方便我們大家使用。下面,我們就 某些常用的容器。這裡我們不涉及容器的基本操作之類,只是要討論一下各個容器其各自的特點。stl中的常用容器包括 順序性容器 vector deque list 關聯容器 map set 容器介面卡 q...

STL各個容器效能詳細比較

寫入40m的int變數 容器記憶體 寫入用時 從頭部移除用時 vector 47m 5 秒 list 程式設計客棧 739m 21秒 69 秒 nb程式設計客棧sp deque 217m 4 秒 2203毫秒 set 821m 137秒 map n 905m 136秒 從上面的資料來看寫入用時vec...

實現乙個STL的vector容器

封裝了vector的資料結構,和push back capacity size 方法,內嵌了iterator迭代器類 include include using namespace std namespace ministl vector 拷貝建構函式 賦值運算子過載函式 void push bac...