一、先從size 和capacity 說起
resize(),設置大小(size);
reserve(),設置容量(capacity);
size()是分配容器的內存大小,而capacity()只是設置容器容量大小,但並沒有真正分配內存。 打個比方:買了一個新房子,新房子裏可以放3張牀reserve(3),這是說房子的容量是最多放3張牀,但是屋裏並不是有三張牀,二resize(3),房裏安裝了3張牀,此時房裏的牀可以使用了。
reserve爲容器預留足夠的空間,避免不必要的重複分配,分配空間大於等於函數的參數,影響capacity。但reserve的功能確實蹩腳,只能用reserve是的capacity變得比之前大。
resize調整容器中有效數據區域的尺寸,如果尺寸變小,原來數據多餘的截掉。若尺寸變大,不夠的數據用該函數第二個參數填充,影響size。
由於vector是順序容器,在內存中分配了一塊連續的存儲空間。爲了保證動態添加元素的高效率,因此必須預先爲vector分配一段空間,這個空間就是capacity。
而容器中元素的個數就是size(),在容器中,capacity總是大於等於 size;
當vector數組插入數據量過大時,其capacity,會變得很大,且清空vector容器後,還會保留原分配的容量capacity。系統不會自動收回空間嗎?真的不會!!!!
我們一點一點寫程序把risize()跟reserve()弄那個明白。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.resize(5);
t.reserve(1);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.resize(20);
t.reserve(2000);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.resize(10000);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
運行結果
我們可以看出當Vector內只有五個元素時其分配空間還是1024,而reserve卻不能做出任何反應,蹩腳,但是reserve能讓容器空間變大,其實vector既然是容器他就會自動分配更多空間,所以reserve差評,這不是重點,重點是怎麼將vector多分配出來的空間收回。有同學要說了clear()。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
運行結果
然而clear只是將容器內的元素清空了,對於分配的capacity,卻沒有作用。在這裏有幾種方法實現降低容量 ,但是其原理相同。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.shrink_to_fit();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
運行結果
當時我比較苦惱時大佬給我了兩個方法,上面那個,還有一個底層的寫法如下。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
auto newt=t;
swap(newt,t);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
cout<<newt.size()<<' ';
cout<<newt.capacity()<<endl;
顯然t容器已經被降低容量,但是其容量降低的代價時newt的容量變大。所以這種方法不可取。還有第三種方法。
vector<int> t;
for(int i=0;i<1000;i++)
{
t.push_back(i);
}
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
t.clear();
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
vector<int>(t).swap(t);
cout<<t.size()<<' ';
cout<<t.capacity()<<endl;
以上就是對於vector的capacity的探究,當數據量較少時,多分配的capacity可以忽略,但是當數據量很大之後,就不能忽略了,所以當你clear之後記着shrink呀。