1. 程式人生 > >C++ STL之 vector的capacity和size屬性區別

C++ STL之 vector的capacity和size屬性區別

vector中這兩個屬性很容易弄混淆。

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。