reserve和resize的區別
1:存儲空間重分配的問題:
我們知道存儲空間分配的問題起源於容器對象的動態創建和連續存儲的特性;因此只有連續存儲的容器纔可能需要運行時的存儲空間分配;
典型就是vector,其他連續存儲容器也會部分地需要存儲空間衝分配;
第一種:如vector,其元素保存在連續的存儲的空間上,當向該vector中插入一個新元素時,必須保持新的容器仍然滿足元素連續存儲的條件;這時候就要重新分配存儲空間,平且把所有的元素都拷貝新開闢的空間裏,然後釋放原來的存儲空間。
第二種:vector當前預留容量足夠帶插入的新元素,不需要進行存儲空間的重分配。
2:存儲空間重分配帶來巨大的開銷那麼如何解決內存重分配的問題呢?
順序容器vector和string都可以用reverse()和resize()來預留空間或者是調整他們的大小,前面迭代器我們知道reverse()用來保留容量,而resize()用來調整容器大小(size,有效元素的個數),而且有的時候也會調整容器的容量。
reserve是容器預留空間,但在空間內不真正創建元素對象,所以在沒有添加新的對象之前,不能引用容器內的元素。
resize 是改變容器的大小,且在創建對象,因此,調用這個函數後,就可以引用容器內的對象了。
void test 01()
{
int num = 0;
int *address = NULL;
vector<int> v;
for(int i=0; i < 10000000 ; i++)
{
v.push_back(i);
if(address != &(v[0]))
{
address = &(v[0]);
num += 1;
}
}
cout<<"num:"<<num<<endl; //30
}
運行程序發現,vector出現了30次擴容,每次都要內存拷貝。內存比較大,耗時。
void test 01()
{
int num = 0;
int *address = NULL;
vector<int> v;
v.reserve(10000000); //如果知道這個容器大概存儲的元素個數,可以提前預留
for(int i=0; i < 10000000 ; i++)
{
v.push_back(i);
if(address != &(v[0]))
{
address = &(v[0]);
num += 1;
}
}
cout<<"num:"<<num<<endl;//1
}