Vector shrink 請求容器降低其容量和size匹配 shrink_to_fit();

一、先從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呀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章