vector中的 size和 capacity和 reserve和 resize

vector中與size()capacity() 相對應的有兩個函數:resize(size_type)reserve(size_type)

微笑Size指目前容器中實際有多少元素,對應的resize(size_type)會在容器尾添加或刪除一些元素,來調整容器中實際的內容,使容器達到指定的大小。

微笑Capacity指最少要多少元素纔會使其容量重新分配,對應reserve(size_type new_size)會這置這個capacity值,使它不小於所指定的new_size

所以用reserve(size_type)只是擴大capacity值,這些內存空間可能還是“野”的,如果此時使用“[ ]”來訪問,則可能會越界。resize(size_type new_size)會真正使容器具有new_size個對象。在對vector進行訪問時,如果使用“[ ]”,則會像變通數組那樣,不進行越界的判斷。如果使用“at(size_type)”函數則會先進行越界的判斷,例如下面兩斷程序:

程序1、

vector<int> v;
v.reserve(2);
v[0]=1;
cout << v[0] << endl;

程序2、

vector<int> v;
v.reserve(2);
v.at(0)=1;
cout << v.at(0) << endl;

兩段程序編譯都正常,執行時程序一會輸出1

這是一個很危險的動作,因爲v[0]這塊內存還是“野”的。而程序二則會收到一條“std::out_of_range”異常,因爲“at size_type)”函數會進行進行下標越界的檢查,來保證程序的安全。此時vectorsize()0,其中並沒有對象,所以對第0個對象的訪問是越界的。

結合下面的程序可以更入的理解程序一中的問題。

程序3、

vector<int> v;
v.reserve(2);
v[0]=1;
cout << v[0] << endl; 
v.reserve(3);
cout << v[0] << endl;

輸出結果是

1

-842151451

原因很簡單,雖然reserve(2)使vector容量擴展成至少爲2,但是這些空間都是空的,也就是v[0]還是一塊“野”內存。所以在使用reserve(3)擴展capacity時,得到的新空間裏什麼都沒有。

 

總結:

1. operator[]at()只能支改動那些確實存在於容器中的元素,不能自動使容器產生新元素。

2. at()提供了越界檢查的功能,使用起來更安全,同時比起operator[]來代價也更大。

3. reserve()只能擴展容器的capacity,不會在其中加入元素。對於reserve()擴展的空間,可以使用push_back(const T&)來填入對象。

轉自:http://blog.163.com/jxguo_05/blog/static/719401002010102523831645/

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