《STL原始碼剖析》之三 序列式容器

2021-08-21 04:56:28 字數 2203 閱讀 9048

談到程式設計,大家首推的可能就是資料結構與演算法,幾乎任何特定的資料結構都是為了實現某種特定的演算法。在stl中將運用最廣的一些資料結構實現出來,比如:array(陣列),list(鍊錶),tree(樹),stack(棧),queue(佇列),hash table(雜湊表),set(集合),map(對映表)等等。

根據資料結構在容器中的排列特性,這些資料結構被分為序列式和關聯式兩種。

所謂序列式容器,其中的元素都可序,但未必有序。在c++本身提供了乙個序列式容器array,stl另外再提供vector,list,deque,stack,queue,priority-queue等等序列式容器。

vector與array非常相似,差別在於空間運用的靈活性。array是靜態空間,一旦配置了就不能改變;vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新的元素。

1.1 vector的迭代器

vector維護的是乙個連續線性空間,所以不論其元素型別為何,普通指標都可以作為vector的迭代器,進行一些迭代器所需要的操作,如:operator*,operator->,operator++,operator+,operator–,operator-,operator+=,operator-=,vector支援隨機訪問。

1.2 vector的資料結構

vector所採用的的資料結構非常簡單:線性連續空間。

template < class t, class alloc = alloc >

class vector

iterator end()

size_type size() const

size_type capacity() const

bool empty() const

reference operator() (size_type n)

reference front()

reference back()

...

vector示意圖如下所示:

1.3 vector的構造與記憶體管理:constructor,push_back

push_back():當我們以push_back()將新元素插於vector尾端時,該函式首先檢查是否還有備用空間,如果有就直接在備用空間上構造元素,並調整迭代器finish,使vector變大。如果沒有備用空間了,就擴充空間(重新配置,移動資料,釋放原空間)

1.4 vector的元素操作:pop_back,erase,clear,insert

下面的示意圖,將為你展示區域性區間清除操作:erase(first,last):

insert():在某乙個位置插入某一元素

相比於vector,list顯得複雜得多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。list本身和list的節點是不同的結構,需要分開設計。list的迭代器不能像vector一樣以普通指標作為迭代器,因為它的節點不保證在儲存空間中連續存在。

list不僅是乙個雙向鍊錶,而且還是乙個環狀雙向鍊錶,所以它只需要乙個指標便可以完整表現整個鍊錶:

《STL原始碼剖析》 序列式容器

stl原始碼剖析 前言 所謂的序列式容器,其中的元素都可序,但未必有序,c 本身提供了乙個序列式容器array,stl 提供了vector,list,deque,srack,queue,priority queue等 一.使用reverse 函式提前設定容量大小 1.1 提前設定的原因 對於vect...

STL原始碼剖析之序列式容器

最近由於找工作需要,準備深入學習一下stl原始碼,我看的是侯捷所著的 stl原始碼剖析 之所以看這本書主要是由於我過去曾經接觸過一些台灣人,我一直覺得台灣人非常不錯 這裡不涉及任何政治,僅限個人感受 在技術上他們比較嚴謹,在為人處世上也非常謙虛,所以一些台灣的技術資料我覺得是值得一看的。想要學習st...

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

第四章 序列式容器 總體概述如下 vector 實現的底層實現物件是陣列,list 底層實現物件是雙向迴圈列表,deque 是雙端開頭的連續線性空間 實現起來比較麻煩 stack 和queue 是配接器,底層可以有 list deque queued 的預設實現是 deque 來實現。1.vecto...