stl原始碼剖析序列式容器之vector

2021-09-25 16:26:03 字數 2660 閱讀 6177

首先介紹下容器的概念,容器是將一些運用最廣的資料結構實現出來,並且根據資料在容器中的排列特性,這些資料結構分為序列式容器以及關聯式容器兩種。其中序列式容器包括array(c++自建)、vector、heap、priority_queue(由heap演變)、list、slist、deque、stack和queue(由deque演變),關聯式容器包括rb-tree、set和map和multiset和multimap(由rb-tree演變)、hashtable、hash_set和hash—map和hash-multiset和hash-multimap(由hashtable演變)。其中序列式容器中的元素都是可序的,但是未必有序,其中stack和queue只是將deque的介面修改了,技術上被歸類為一種配接器(adapter)。

vector

vector各個方面和陣列array都十分類似,惟一的區別是空間的運用的靈活性,array是乙個固定了大小的靜態空間,一旦配置之後就不能修改了,然後vector是乙個動態的空間,隨著新元素的加入,它的內部會自行擴充,vector的擴充也是乙個配置新空間、資料移動、釋放舊空間的大工程。

vector定義的原始碼如下所示:

templateclass vector

void fill_initialize(size_type n,const t& value)

public:

iteration begin()

iteration end()

size_type size()const

size_type capacity()const

bool empty()const

reference operator (size_type n)//返回從begin開始後的第n個元素的引用,這確保了可以賦值成功。

vector():start(0),finish(0),end_of_storage(0){}

vector(size_type n,const t& vlaue)

vector(int n,const t& vlaue)

vector(long n,const t& vlaue)

explicit vector(size_type n)//宣告為explicit的建構函式不能在隱式轉換中使用,t()相當於乙個呼叫預設初始化的建構函式,它的初始化的預設值為0

~vector()

reference front()

reference back()

void push_back(const t& x)

else 

insert_aux(end(),x);//沒有備用空間,擴充空間(重新配置,移動資料,釋放原空間)

}void pop_back()

iterator erase(iterator position)

void resize(size_type new_size,const t& x)

else//無備用空間

catch(.....)

destroy(begin(),end());//析構並釋放原來的vector。

deallocate();

start=new_start;//調整start和finish和end_of_storage,使它們指向新的vector。

注意一點,動態增加大小,從上述**可以看出,並不是在原來的空間之後接上新的空間,而是要經過配置,複製,釋放三個操作,因此,對vector的任何操作,一旦引起來空間重新配置,之前的指向原vector的迭代器就失效了,vector裡面的函式包括void pop_back()、iterator erase(iterator first,iterator last)、iterator erase(iterator position)、void insert(iterator position ,size_type n,const t&x),挑選其中的幾個進行剖析。

iterator erase(iterator first,iterator last)

iterator erase(iterator position)

void clear()

void insert(iterator position, const t& value)

//在position位置之後,插入n個值為value的元素

void insert(iterator position, size_type n, const t& value)

else

}else

catch (...)//如果失敗了

//析構並釋放原vector

destroy(begin(), end());

//刪除記憶體

deallocate();

//調整迭代器,指向新的vector

start = new_start;

finish = new_finish;

end_of_storage = new_start + len;}}

上述**的操作可以用接下來的幾幅圖進行乙個很直觀的展示:

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

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

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

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

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

deque概述 deque是一種雙開口的連續線性空間,可以在頭尾兩端分別做元素的插入和刪除操作 deque沒有容量的概念,它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈結起來 deque的中控器 deque由一段一段的定量連續空間構成 一旦有必要在deque前端或尾端增加新空間,便配...