2011-09-20 68 views
0

STL向量的容量在無(明顯)原因下翻倍。插入第一個對象後,STL向量的容量爲1000 init初始大小的一倍

我創建一個初始大小爲1000的矢量,插入一個項目。我期望容量保持1000

vector <int> vec(1000); 

cout << "vector capacity " << (unsigned int)vec.capacity() << endl; 
vec.push_back(11); 

cout << "vector capacity " << (unsigned int)vec.capacity() << endl; 

的輸出是:1000

矢量容量2000 矢量容量 - >插入一個項

回答

1

我期望後容量保持1000.

尺寸從1000開始,所以容量Ÿ必須是至少1001

至於增加一倍,這是因爲一個vector是一個dynamic array,容量每一個的size() > capacity()威脅彈出時間加倍可以確保得到攤銷O(1)push_back。引用維基百科:

作爲n插入元素,容量形成幾何級數。以任何恆定比例擴展陣列確保插入n元素總體上花費O(n)時間,這意味着每個插入需要分攤恆定時間。該比例的值一個導致時空折中:每插入操作的平均時間是大約一個 /(一個 -1),而浪費的細胞的數量是通過(一個上界-1)n

1

std :: vector的構造函數創建一個帶有1000個元素的向量,初始化爲默認值,在這種情況下爲0.它不會創建一個空的向量,其中1000個元素將在後面追加。

然後添加一個額外的元素,因此vector的size()現在是1001.因爲它需要重新分配,所以它將分配的容量加倍,以分攤後面的push_back()。

0

首先,不要混淆size()capacity()

  • size()爲您提供了載體包含的元素的數量。
  • capacity()給出了當前保留的存儲器插槽的數量(存儲器中存儲了多少個元素)。容量總是等於或大於尺寸。

現在,vector<int> vec(1000);創建大小 1000的矢量,因此添加一種元素會給你1001

容量,在另一方面,自動地被矢量處理大小的矢量,以及如何取決於實施。這樣做的典型方式是每當向量增長時將容量翻倍,所以實際上,添加新元素的平均時間保持不變,無論向量中有多少項。