《STL原始碼剖析》讀書筆記 (2)序列式容器

2021-05-25 09:22:08 字數 2153 閱讀 4161

第四章

序列式容器

總體概述如下:

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個區塊 調出...