vector的reserve()和resize()

vector 的reserve()增加了vector的capacity,但是它的size沒有改變!resize()改變了vector的capacity同時也增加了它的size!


reserve(n) 預分配n個元素的存儲空間。

reserve()可按以下實現:
如果n大於容器現有的容量(即capacity()),則需要在自由內存區爲整個容器重新分配一塊新的更大的連續空間,其大小爲n*sizeof(Type),然後將容器內所有有效元素從舊位置全部拷貝到新位置(調用拷貝構造函數),最後釋放舊位置的所有存儲空間並調整容器對象的元素位置指示器(就是讓那3個指針指向新內存區的相應位置)。也就是說,如果請求容量比原有容量大的話,結果是容器的冗餘容量加大,而容器本身的有效元素不會發生任何變化,即容器的大小並沒有改變。如果n小於或等於現有容量,則什麼也不做。


1、resize(n)

調整容器的長度大小,使其能容納n個元素。

如果n小於容器的當前的size,則刪除多出來的元素。否則,添加採用值初始化的元素。

2、 resize(n,t)

多一個參數t,將所有新添加的元素初始化爲t。


void resize(size_type n, const T&c=T());

其中n就是最後要保持的元素個數,如果需要新增元素的話,c則是新增元素的默認初始值。resize()實現策略:

如果n大於容器當前的大小(即size()),則在容器的末尾插入(追加)n-size()個初始值爲c的元素,如果不指定初始值,則用元素類型的默認構造函數來初始化每一個新元素。如果n小於容器當前的大小,則從容器的末尾刪除size()-n個元素,但不釋放元素本身的內存空間,因此容量不變。

否則,什麼也不做。


瞭解這兩個函數的區別,首先要搞清楚容器的capacity(容量)與size(長度)的區別。
size指容器當前擁有的元素個數;
而capacity則指容器在必須分配新存儲空間之前可以存儲的元素總數。
也可以說是預分配存儲空間的大小。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v;
	v.reserve(100);//元素尚未構造,無法訪問

	//cout << v[1] << endl;//error
	for (int i = 0; i < 100; i++)
		v.push_back(i);//新元素構造

	v.resize(102);
	cout << v[101];//在VS2015上默認爲0,使用resize()後可以訪問數據
	v[101] = 101;//right

	return 0;
}


#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vect;

	vect.push_back(1);
	vect.push_back(2);
	vect.push_back(3);
	vect.push_back(4);

	vect.reserve(100);
	cout << vect.size() << endl;  //4
	cout << vect.capacity() << endl; //100

	/*
        for (int i = 0; i < 100; i++)
	     cout << vect[i] << endl;//error
        */
	return 0;
}






#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vect;

	vect.push_back(1);
	vect.push_back(2);
	vect.push_back(3);
	vect.push_back(4);

	vect.resize(100);    //新的空間不覆蓋原有四個元素佔有的空間,現在size和capacity都是100

	cout << vect.size() << endl;
	cout << vect.capacity() << endl;

	for (int i = 0; i < 100; i++)
		cout << vect[i] << endl;//now right!
	

	return 0;
}



#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vect;

	vect.resize(100);    //分配100個空間

	vect.push_back(1);
	vect.push_back(2);
	vect.push_back(3);
	vect.push_back(4);

	cout << vect.size() << endl; //  104
	cout << vect.capacity() << endl;//(VS2015上是) 150
	//現在size是104,capacity至少是104
	for (int i = 0; i < 104; i++)
		cout << vect[i] << endl;
	

	return 0;
}





發佈了57 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章