首先介紹下容器的概念,容器是將一些運用最廣的資料結構實現出來,並且根據資料在容器中的排列特性,這些資料結構分為序列式容器以及關聯式容器兩種。其中序列式容器包括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前端或尾端增加新空間,便配...