C++ STL之 vector的capacity和size屬性區別
阿新 • • 發佈:2019-01-09
vector中這兩個屬性很容易弄混淆。
size是當前vector容器真實佔用的大小,也就是容器當前擁有多少個容器。
capacity是指在發生realloc前能允許的最大元素數,即預分配的記憶體空間。
當然,這兩個屬性分別對應兩個方法:resize()和reserve()。
使用resize(),容器內的物件記憶體空間是真正存在的。
使用reserve()僅僅只是修改了capacity的值,容器內的物件並沒有真實的記憶體空間(空間是"野"的)。
此時切記使用[]操作符訪問容器內的物件,很可能出現數組越界的問題。
下面用例子進行說明:
執行結果為:(win 10 + VS2010)#include <iostream> #include <vector> using std::vector; int main(void) { vector<int> v; std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl; v.reserve(10); std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl; v.resize(10); v.push_back(0); std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl; return 0; }
(若圖片顯示模糊的話,請右鍵在新視窗中開啟檢視圖片)
注:對於reserve(10)後 接著直接使用[]訪問越界報錯(記憶體是野的),大家可以加一行程式碼試一下,我這裡沒有貼出來。
這裡直接用[]訪問,vector退化為陣列,不會進行越界的判斷。此時推薦使用at(),會先進行越界檢查。
相關引申:
針對capacity這個屬性,STL中的其他容器,如list map set deque,由於這些容器的記憶體是雜湊分佈的,因此不會發生類似realloc()的呼叫情況,因此我們可以認為capacity屬性針對這些容器是沒有意義的,因此設計時這些容器沒有該屬性。
在STL中,擁有capacity屬性的容器只有vector和string。