2016-11-23 9 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)の挿入の複雑さを得るので、サイズ変更アレイの考え方を非常に効率的にします。 最初のベクトルにもう1つの整数を追加すると、容量は6になります。http://coliru.stacked-crooked.com/a/f084820652f025b8

0

必要以上に多くの要素を割り当てると、新しい要素が追加されたときにベクトルを再割り当てする必要はありませんベクター。また、サイズを縮小する場合、再割り当てはまったく必要ありません。

メモリの再割り当ては、比較的高価な操作(新しいブロックの作成、要素のコピー、古いブロックの削除)です。

トレードオフは、ベクターが必要以上に多くのメモリを割り当てている可能性があることです(追加/使用されない要素にメモリを割り当てる場合など)。実際には、使用可能なメモリが不足している場合を除いて、より大きなブロックを割り当てるコスト(およびあまり頻繁に再割り当てしない)は、コストよりも少なくなるか、毎回再割り当てされます。

関連する問題