第四章
序列式容器
總體概述如下:
vector
實現的底層實現物件是陣列,
list
底層實現物件是雙向迴圈列表,
deque
是雙端開頭的連續線性空間(實現起來比較麻煩);
stack
和queue
是配接器,底層可以有
list
、deque(queued
的預設實現是
deque)
來實現。 1.
vector
vector
是動態空間,維護的是乙個連續的線性空間,實現動態增長的機制如下:
1.配置新空間;
2.資料移動;
3.釋放舊空間
sgi的stl
的空間配置策略是:以原來大小的兩倍另外配置一塊較大的空間
vector
的迭代器就是普通指標;
template<classt,classalloc= alloc>
class
vector
;vector
的資料結構:
template<classt,classalloc= alloc>
class
vector
;迭代器
start
和finish
分別指向配置的的來的連續空間中已經被使用的範圍,
end_of_storage
指向整塊連續空間的尾端;
2 list 從
list
的節點定義如下:
template<classt>
struct
_list_node
我們可以看出,
list
實際上是乙個雙端佇列;
stl中節點的插入、刪除都與資料結構課程中的鍊錶操作無異,不在詳述; 2.
deque
deque
是乙個雙端開口的佇列,頭尾都可以做
pop()/push
操作;
deque
與vector
的最大差異,一在於
deque
允許在o(1)
時間內對頭端進行元素的插入和移除,二在於
deque
沒有容量(
capacity
)的概念;
deque
的資料結構:
deque
是一段一段定量連續的空間構成,一旦有必要在
deque
兩端申請新空間,便申請一段定量的連續空間,串接在整個
deque
的首端或尾端,具體實現是有乙個中控器、若干迭代器、若干緩衝區
buffer
構成,如下: 與
vector
非常不一樣。
map實際上就是乙個是整數組,裡面的每乙個元素都指向緩衝區的開頭。每乙個迭代器的資料結構定義如下: t
data
;t*
cur;
t* finish
;t*
last
;map_pointer
node
;顯然,
iterator
在移動的時候,要比較注意:各種指標運算,加、減、前進、後退,都不能直觀視之;其中最關鍵的就是
:一旦遇到緩衝區的邊緣,要特別當心,可能要調到先乙個緩衝區,也有可能要新開闢乙個緩衝區;
迭代器在隨機訪問的時候(前進或者後退
n個單元,也要注意這種情況的發生) 3.
heap
heap
實現了優先順序佇列
priority_queue
。他的實現與任何一本資料結構的教材無區別,用的是最大堆。(主要是堆調整、建堆兩個步驟,對於堆這個資料結構,我還是非常熟悉的,呵呵)。
STL原始碼剖析讀書筆記
一.stl提供六大元件,彼此可以組合套用。1.容器 containers 各種儲存結構,如vector list deque set map,用來存放資料。2.演算法 algorithme 各種常用演算法,如sort search copy erase等。3.迭代器 iterators 扮演容器與演...
《STL原始碼剖析》讀書筆記 三
hashtable 非標準 二叉搜尋樹 任何節點最多只能允許兩個子節點 平衡二叉樹 確保整棵樹的深度為o logn 左右子樹的高度最多差1 setmap multiset 特性與用法與set完全相同,唯一的差別在於它允許鍵值重複,插入的時候用的是rb tree的insert equal 而不是ins...
《STL原始碼剖析》讀書筆記 四
在stl中,所有的元素都是存放在容器中,容器需要配置空間來儲存這些數值,因此需要用到空間配置器。記憶體池 chunk alloc的工作 從記憶體池中取空間給free list使用。if 記憶體池水量足夠 直接調出20個區塊給free list else if 記憶體池水量還足夠提供至少1個區塊 調出...