作者: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圖:
好了,通過這幾張圖,我想你應該能比較詳細的瞭解vector中空間的運作狀況了。
- 下面轉一些具體的操作
- 特別的使用
我們可以把vector當作原始數組來使用,但是要注意一點的是,當做地址使用的時候,不要使用v.begin()的iterator,雖然對於某些實現來說,這樣使用是沒有問題的,但是,這樣並不通用,我們應該正確的使用方法是&v[0]
對於vector<bool>這種情況,STL的實現考慮到空間效率,並不是將一個真正的bool作爲一個元素進行存儲的,而是使用1bit來將空間縮小8倍,所以說,對於vector<bool>的使用,需要注意到這一點,當然,對於它也有一些自己特別的函數