在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)”函數會進行進行下標越界的檢查,來保證程序的安全。此時vector的size()爲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/