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();
}
其結果如下:
可以發當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倍。