STL 簡單 vector 的實現

2021-08-21 04:06:58 字數 1678 閱讀 6546

stl 簡單 vector 的實現

我用vs2013寫的程式(

github

),vector版本的**位於

我是照著侯捷老師的《stl原始碼剖析》做的cghstl,現在才看到第三章,覺得這本書的編排非常適合自學。

第一章講解空間配置器,這是stl最基礎的部件,沒什麼好說的。

第二章講解迭代器,老師舉了單向鍊錶的例子,這非常有考究,單向鍊錶不需要連續的儲存空間,意味著使用單向鍊錶實現的容器不需要考慮空間溢位等問題,我們可以把注意力集中在容器的迭代器上。

第三章講解序列式容器,第一節介紹vector的實現,vector需要考慮空間的連續使用和空間溢位等問題,而正因為vector維護的是連續線性空間,所以不論其元素型別為何,普通指標都可以作為vector的迭代器而滿足所有必要條件!這成功的避開了設計容器時不得不分散精力設計迭代器的坑!

侯捷老師寫書真是有水平啊!

言歸正傳,接下來我們看看乙個vector的實現細節。

我們一共有四個檔案:

1.      globalconstruct.h,構造和析構函式檔案,位於

2.      cghalloc.h,空間配置器檔案,位於

資料夾下

先看第乙個,globalconstruct.h建構函式檔案

按照stl的介面規範,正確的順序是先分配記憶體然後構造元素。建構函式的實現採用placement new的方式;為了簡化起見,我直接呼叫析構函式來銷毀元素,而在考慮效率的情況下一般會先判斷元素是否為non-trivial型別。

關於 trivial 和 non-trivial 的含義,參見:stack overflow

cghalloc.h是空間配置器檔案,空間配置器負責記憶體的申請和**。

class cghallocator是空間配置器類的定義,主要的四個函式的意義如下:allocate函式分配記憶體,deallocate函式釋放記憶體,construct構造元素,destroy析構元素。這四個函式最終都是通過呼叫_allocate、_deallocate、_construct、_destroy這四個內聯函式實現功能。

我們自己寫的空間配置器必須封裝一層stl的標準介面,

template>

class ******_alloc

vector的實現**如下:

cghvector.h

cghvector實現了pop_back、push_back、erase。

注釋已經寫得足夠詳細。 cghvector.h中呼叫了三個標準全域性函式:std::copy_backward、std::uninitialized_copy、std::copy,這三個函式。

測試**:

可以看到當cghvector的大小(size)超過容量(capacity)時,cghvector自動擴容,每次擴充為原來的2倍。

stl 簡單 vector 的實現

STL容器 vector的使用 C 簡單實現

上次我們聊到了順序容器與關聯容器的概念,也簡要總結了stl中主要容器的分類,同時也對list具體的使用與實現進行了描述,這次我們關注vector vector字面意思很好理解,向量 這樣我們可以直接得知它屬於一種順序容器,那麼意味著他在記憶體上的分布是連續的,那麼我們順理成章的可以想到其內部是用陣列...

實現STL中的向量 vector

用到陣列就會想到對應的可以動態增加空間的向量vector 下面是模擬stl的基本功能,參 c primer 第四版 將實現檔案也寫到類中的,可以無視 風格 這裡用到了記憶體管理的類 allocator allocatora 定義allocator的物件,可以構造分配t型別的物件 a.allocate...

Vector的簡單實現

曾經在論壇上看到面試時候被問到stl中vector的實現,想想如果真的要實現vector的原始碼,僅僅是乙個allocator就非常麻煩,一二時分鐘內是搞不定的,面試官出這道題也就是想知道你對stl的實現理解程度。template class vector vector const vector r...