增長三部曲:
另覓更大空間
將原資料複製過去
釋放原空間三部曲
環形雙向鍊錶 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...