STL源碼剖析筆記(二)---容器

容器,是STL中很重要的一部分,是容納特定類型對象的集合,因此容器中的對象必須是同一個類型,而且必須是可拷貝構造和可賦值的。STL爲容器的遍歷提供了迭代器,還提供了很多算法,如排序,查找等。

也可以把容器理解爲我們學過的數據結構,我們學過的數據有array(數組),list(鏈表),stack(棧),set(集合),tree(樹) ··· 這些數據結構分爲序列式和關聯式,所以容器就分爲序列式和關聯式。

序列式容器
將一組有相同類型T的對象,以嚴格的線性的方式組織在一起。

vector
它的數據結構是一個線性的連續空間,就像順序表,其中有兩個迭代器start和finish分別指向已使用空間的首部和尾部,迭代器end_of_storage指向分配的連續空間的尾部。如圖:
這裏寫圖片描述

爲了節省空間,在分配內存的時候並不是一次性分配一個很大的內存空間,採用的策略是先分配一小塊內存空間,不夠了,再增容,也就是動態增容。增容的時候要先申請一個比原空間大二倍的空間,然後把原來的數據拷貝到新開的空間裏,最後釋放原空間。但是這也有可能造成迭代器失效的問題,指向原空間的迭代器會失效。

vector的一些常見接口:
這裏寫圖片描述
有常見的插入,刪除等操作,重載了[]可以使它像數組一樣取到數據,但是一般不用operator[],因爲沒有邊界檢查,推薦使用at(),如果超過了範圍會拋出異常。

list
STL中的list是一個環形的雙向鏈表,並且帶頭結點。
list的接口:
這裏寫圖片描述

deque
雙端隊列,接口和vector類似。

關聯式容器
提供一個key值實現對元素的隨機訪問,並且key是有序的

map
map底層是用紅黑樹實現的,所有的結點都是Pair型的,第一個元素是key值,第二個元素是value,建立紅黑樹是根據key值。可以通過迭代器來改變value的值,但不能改變key值,否則會破壞它的結構。

multimap:和map的用法相同,與map的區別是允許key值重複。

set
底層的實現也是紅黑樹,與map的區別是沒有key值和value值之分,不能通過迭代器來改變值,因此底層的iterator被定義爲const_iterator.

multiset:與set的區別是值可以重複。

發佈了62 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章