STL原始碼剖析讀書筆記之vector

2021-07-11 01:20:07 字數 2152 閱讀 4024

stl原始碼剖析讀書筆記之vector

1.vector概述

vector是一種序列式容器,我的理解是vector就像陣列。

但是陣列有乙個很大的問題就是當我們分配

乙個一定大小的陣列的時候,起初

也許我們不會覺得陣列容量太小不合需求,但是隨著資料量的增加,

陣列尺寸

大小不再滿足需求,此時我們需要手動的去擴充套件其大小。然而vector就幫我們

完全實現了乙個可

自適應增長的陣列功能。

那麼這樣看來vector其實也就是一種可自適應增長的動態陣列的類的實現。

2.關於vector的定義

其實用過vector的人都知道 vector的定義大都像這個樣子:

1 vectorv1;

2 vectorv2;

很顯然vector是一種與型別無關的類模板,支援各種型別的vector,這

也很好的體現了c++的泛型思想,正

是這種型別無關性,使得stl在各種

平台上廣為使用。

這裡我只是貼出stl原始碼剖析書中一小部分vector定義

1 template 

2class

vector

318 iterator end()

19 size_type size() const

20 size_type capacity() const

21 reference front

22 }

上面有幾個關鍵點:

vector維護了三個迭代器:start,finish和end_of_storage

由typedef valuetype* iterator可知迭代器說白

了就是指標。

那麼vector維護的三個迭代器(指標)的意思是什麼呢。

start指向vector的第乙個元素。

finish

指向vector已經使用的空

間的最後乙個元素的下乙個元素。

end_of_storage指向vector總共可用空間的最後

乙個元素的下乙個元素

所以操作vector

與操作指標完全類似,只是在vector中把這些操作封裝

成相應的方法

直接供讀者使用罷了。

3.vector記憶體分配原理

不是之前我們說vector是一種自增長的動態陣列嗎?

那麼其子增長的原理是什麼。

其實很簡單:

1.當vector為空時,我們插入乙個元素到vector中,這時候

vector將記憶體容量變為1,然後將新的元素插入其中

2.當vector容量為1的時候,此時vector中剛好有乙個元素,若要插入乙個2,

這時候將重新new乙個記憶體為2的新

空間,將之前

記憶體中的1拷貝

到新記憶體並釋放1舊記憶體,同時將新的元素2插入其中

3.重複步驟2,只要就記憶體容量已滿就重新分配新記憶體,

新記憶體的大小是舊記憶體的二倍,再講舊記憶體中的資料

賦值到新記憶體,同

時釋放新記憶體。同時插入新元素在新

的記憶體空間。

我們可以用下面的程式驗證這一點:

1 #include 2 #include 3

using

namespace

std;45

int main(int argc, char*argv)

6

截圖如下:

此外,有幾個問題需要注意:

1.為什麼vector容量滿了之後要重新開闢新的記憶體,因為vector要求連續的記憶體空間

2.如果重新開啟新記憶體太頻繁應該會造成較大的程式開銷,怎麼辦.我們可以一開給reserve乙個大的capacity.

3.重新開啟新記憶體是否會造成原來的迭代器失效 ?是的,所以我們最好知道何時會開闢新的capacity,進而防止這種迭代器失效。

4.對於vector刪除或者插入造成的迭代器失效已經在之前的博文中有介紹。

STL原始碼剖析讀書筆記

一.stl提供六大元件,彼此可以組合套用。1.容器 containers 各種儲存結構,如vector list deque set map,用來存放資料。2.演算法 algorithme 各種常用演算法,如sort search copy erase等。3.迭代器 iterators 扮演容器與演...

stl原始碼剖析讀書筆記之allocator

第二章開始作者定義了乙個簡單的模板類jj allocator,有allocator的所有介面,包括allocator deallocate construct destroy 四個成員函式 但是開啟 stl原始碼中的stl alloc.h,sgi stl用的最多的std alloc並沒有constr...

《STL原始碼剖析》讀書筆記 三

hashtable 非標準 二叉搜尋樹 任何節點最多只能允許兩個子節點 平衡二叉樹 確保整棵樹的深度為o logn 左右子樹的高度最多差1 setmap multiset 特性與用法與set完全相同,唯一的差別在於它允許鍵值重複,插入的時候用的是rb tree的insert equal 而不是ins...