vector對象增長容量大小測試

vector對象增長說明

  在C++中,vector是一個非常好用的容器,該容器大小可變,而且將元素連續儲存。如果容器的儲存空間已滿,此時向容器中添加新元素,則容器必須分配新的內存空間來保存已有元素和新元素,將已有元素從舊位置移動到新空間中,然後添加新元素,釋放舊儲存空間。這樣就會導致每次添加新元素時,vector就執行一次內存分配和釋放操作,性能會明顯的變慢。
  爲了避免這種問題,標準庫採用了減少容器空間重新分配次數的策略:當不得不獲取新的內存空間時,vector和string的實現通常會分配比新的空間需求更大的內存空間
下面來看看測試程序,測試平臺VScode + GCC:

int main()
{
    
    vector<int> a;
    cout <<"未添加元素前"<< endl;
    cout <<"vector a size: " << a.size() << endl; 
    cout <<"vector a capacity : " << a.capacity() << endl;
    cout << endl;
    //向a中添加10個元素
    for(size_t i = 0; i < 10; i++)
    {
        a.push_back(i);
    }
    cout <<"添加10個元素後"<< endl;
    cout <<"vector a size: " << a.size() << endl;
    cout <<"vector a capacity : " << a.capacity() << endl;
    cout << endl;

    
    //將capacity設置爲至少20
    a.reserve(20);
    cout <<"將capacity設置爲20"<< endl;
    cout <<"vector a size: " << a.size() << endl;
    cout <<"vector a capacity : " << a.capacity() << endl;
    cout << endl;

    //向a中添加元素
    while(a.size() != a.capacity())
        a.push_back(0);
    cout <<"向a中添加滿元素"<< endl;
    cout <<"vector a size: " << a.size() << endl;
    cout <<"vector a capacity : " << a.capacity() << endl;
    cout << endl;

   
    //再添加一個1
    a.push_back(1);
    cout <<"待儲存空間滿後,再添加一個"<< endl;
    cout <<"vector a size: " << a.size() << endl;
    cout <<"vector a capacity : " << a.capacity() << endl;
    cout << endl;
    getchar();
}

其結果如下:
vector
可以發當a.size() = a.capacity()時,再向a中添加元素,vector會自動分配新的內存空間,容量是當前容量的兩倍。當不想a佔用這些空餘的內存時,可以使用shrink_to_fit來使vector的大小與當前儲存的元素數量一致,代碼如下:

    a.shrink_to_fit();
    cout <<"清理多餘的內存"<< endl;
    cout <<"vector a size: " << a.size() << endl;
    cout <<"vector a capacity : " << a.capacity() << endl;
    cout << endl;

結果如下圖:
在這裏插入圖片描述
通過此次小測試(平臺:VScode + GCC),說明了vector擴展內存的方式:將當前的容量進行翻倍處理

將以上程序在VS2013中測試,測試結果如下:
在這裏插入圖片描述
在此平臺下(VS2013),vector擴展內存的方式:對當前的容量擴容至1.5倍

小結
通過上述兩個測試說明vector在不同平臺下,擴容方式存在差異:在GCC下是擴容至當前容量的2倍,而在vs下是擴容至當前容量的1.5倍

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