2016-11-23 69 views
3

以下是向量程序,並給出了在C++ 11模式下容量的不同結果。爲什麼矢量具有不同的容量和大小?

#include<iostream> 
#include<vector> 
using namespace std; 

int main(){ 
vector<int>a ={1,2,3}; 
cout<<"vector a size :"<<a.size()<<endl; 
cout<<"vector a capacity :"<<a.capacity()<<endl<<endl;; 

vector<int>b ; 
b.push_back(1); 
b.push_back(2); 
b.push_back(3); 
cout<<"vector b size :"<<b.size()<<endl; 
cout<<"vector b capacity :"<<b.capacity()<<endl; 
return 0; 
} 

OUTPUT
矢量大小:3
向量的容量:3

矢量b大小:3
矢量b容量:4

爲什麼此程序會產生不同的值對於a和b的容量,兩者都有相同數量的值,以及大小與容量有何不同?

+0

但我認爲這是我的問題的部分答案。因爲爲什麼在相同的PC和相同的編譯器中向量a和b的容量變得不同。 –

+1

@GIRISHkuniyal爲什麼變得不同?初始化是不同的。 –

+0

@GIRISHkuniyal在第一種情況下,矢量知道你想要插​​入的元素總數。這可能是因爲你永遠不會再插入元素(例如:如果你已經將'a'聲明爲'const'),所以不需要分配額外的元素。在第二種情況下,每個'push_back'調用都假定有更多的調用來臨,所以向量是保守的,並且爲了以防萬一而分配更多的調用。 – KABoissonneault

回答

3

原因與矢量的擴展算法的本質有關。 初始化向量時,應用的額外容量的數量爲0. 在第i次需要擴展時,向量將其包含複製到一個新向量,其容量翻倍,然後將其當前大小。 這個方法使整個變量大小的數組非常有效,因爲在分期時間內(意味着N次操作的平均時間),我們得到了O(1)插入的複雜度。 你可以看到,當我們添加的第一個向量多一個整數,我們得到的6 http://coliru.stacked-crooked.com/a/f084820652f025b8

0

能力通過分配比需要更多的元素,矢量並不需要重新分配內存時,新的元素被添加到向量。另外,在縮小尺寸時,根本不需要重新分配。

重新分配內存是一個相對昂貴的操作(創建新塊,複製元素,刪除舊塊)。

權衡是指向量可能已經分配了比它所需要的更多的內存(例如,如果它爲永不會被添加/使用的元素分配內存)。實際上,除非可用內存稀少,否則分配較大塊的成本(並且不太經常重新分配)低於每次成本或重新分配的成本。