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