STL學習筆記----vector

作者:winterTTr(轉載請註明) 資料來源:《The C++ Standard Library》

 

 

vector是STL中最簡單,也是最常用的一個標準容器之一了。

其實,他就是對動態數組的封裝,然後對於insert等操作進行的時候,在空間不夠的情況下,會自動進行空間擴充及內容拷貝等等。

這裏簡單總結一下接口,然後說幾點注意問題

 

 

  • size() vs capacity()

size函數返回的是當前數組中的實際存儲的元素數量。

capacity返回的是,當前數組中已申請空間的大小,所以說 size() <= capacity()

  • resize() vs reserve()

resize()重新分配數組的大小,讓保證其不小於參數指定的數值。如果參數小於capacity(),會將多餘數據清除掉(調用析構函數)。如果大於capacity()會重新分配空間並拷貝原始數據,同時,對於大於size()的部分,使用默認參數初始化。

但是reserve並不進行元素的初始化,而只是進行空間的分配。當然,如果原始數據需要copy,是會調用拷貝構造函數的。

 

PS: resize()是有默認參數的 ,類似於void resize( typename T t = T() )

下面以一個例子分析一下resize(),究竟會發生什麼:

程序的結果如下:

2293536|default constructor
4074448|copy constructor from:2293536
2293536|destructor
push one item ==>
size() 1
capacity() 1

2293536|default constructor
4074576|copy constructor from:4074448
4074577|copy constructor from:2293536
4074448|destructor
2293536|destructor
push another item ==>
size() 2
capacity() 2

2293312|default constructor
4074577|destructor
2293312|destructor
resize 1 ==>
size() 1
capacity() 2

2293312|default constructor
4074448|copy constructor from:4074576
4074449|copy constructor from:2293312
4074450|copy constructor from:2293312
4074576|destructor
2293312|destructor
resize 3 ==>
size() 3
capacity() 3

4074448|destructor
4074449|destructor
4074450|destructor

 

下面是一個分析的Sequence圖:

push one item

 

 

push another item

 

 

好了,通過這幾張圖,我想你應該能比較詳細的瞭解vector中空間的運作狀況了。

  • 下面轉一些具體的操作

 

  • 特別的使用

我們可以把vector當作原始數組來使用,但是要注意一點的是,當做地址使用的時候,不要使用v.begin()的iterator,雖然對於某些實現來說,這樣使用是沒有問題的,但是,這樣並不通用,我們應該正確的使用方法是&v[0]

 

 

對於vector<bool>這種情況,STL的實現考慮到空間效率,並不是將一個真正的bool作爲一個元素進行存儲的,而是使用1bit來將空間縮小8倍,所以說,對於vector<bool>的使用,需要注意到這一點,當然,對於它也有一些自己特別的函數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章