簡単な質問です。サイズ 20 のベクトルを宣言するとしましょう。次に、push_back を使用してそれにいくつかの整数を追加したいとします。
vector<int> myVector(20);
myVector.push_back(5);
myVector.push_back(14);
ベクターの容量は現在 22 ですか、それとも 20 のままですか? インデックス [19] と [20] にそれぞれ 5 と 14 が追加されましたか? それとも [0] と [1] ですか?
それらのステートメントの後、その容量は実装によって定義されます。(サイズとは異なりますのでご注意ください。)
vector<int> myVector(20);
これにより、20個の0で満たされたベクトルが作成されます。そのサイズは正確に20であり、その容量は少なくとも20です。正確に20であるかどうかは、実装によって定義されます。それはもっとあるかもしれません(おそらく実際にはそうではありません)。
myVector.push_back(5);
この後、配列の21番目の要素は5になり、容量は再び実装によって定義されます。(以前は容量がちょうど20であった場合、現在は不特定の方法で容量が増加しています。)
myVector.push_back(14);
同様に、配列の22番目の要素は14であり、容量は実装によって定義されます。
スペースを予約したいが要素を挿入したくない場合は、次のようにします。
vector<int> myVector;
myVector.reserve(20); // capacity is at least twenty, guaranteed not
// to reallocate until after twenty elements are pushed
myVector.push_back(5); // at index zero, capacity at least twenty.
myVector.push_back(14); // at index one, capacity at least twenty.
sizeベクトルコンテナ内の要素の数です。capacity割り当てられたストレージスペースのサイズですpush_backベクトルサイズを効果的に1つ増やします。これにより、呼び出し前のベクトルサイズがベクトル容量と等しい場合、内部に割り当てられたストレージが再割り当てされます。さて、vectorメンバー関数がありますpush_back。のような他のシーケンスdequeはpush_front。
0、1、2、......、最終
追加後:
0、1、2、.....、最終、加算、..。
あなたはそれを思い出すかもしれません:
capacity() returns the number of elements in the vector sufficient,
without allocating additional memory.
This number can be greater or equal to size.
つまり、はvectorインデックスによる要素への迅速なアクセスに特化しているため、前面または中央に追加することはできません。前後に追加したい場合は、dequeに似たものを使用できますvector。前面、背面、および使用できる場所に追加する場合list。とlistのようなインデックスは提供されないことに注意してください。dequevector
ただし、ベクトルは実際のサイズよりも多くの容量を持っていると見なされます。要素を追加するときに、追加のメモリを割り当てる必要はありません。容量がサイズと等しい場合にのみ実行されます。多くのコンパイラでは、新しい容量は古い容量の2倍になります。割り当て後、すべての要素を新しい場所にコピーします。ただし、このような動作はメモリの面でコストがかかる可能性があります。
push_backベクトルの容量を少なくともベクトルの新しいサイズに増やしますが、おそらく(おそらく)いくらか大きくなります。
push_backO(1)の償却時間で実行する必要があるため、各再割り当ては古い容量の数倍になります。一般的な実装では、倍数は2です。
ただし、正確な容量の増加は指定されていません。容量を正確に制御する必要がある場合は、を使用してreserveください。
..。
あなたの質問を読み直して、あなたがベクトルのサイズとその容量の違いを理解しているかどうかはわかりません。サイズは要素の数です。容量は、再割り当てを実行せずにベクトルが保持できる要素の数です。つまりpush_back、再割り当てが発生する前に、capacity()-size()要素を使用できます。
あなたの例では、5と14がそれぞれmyVector[20]とmyVector[21]に表示されます。
push_backのサイズを大きくしstd::vector、新しい要素を の後ろに配置しますvector(他のコンテナにもpush_front同じことを前に行うメソッドがあります)。
ただし、 のサイズと容量には違いがありvectorます。サイズは、現在実際にいくつのアイテムが入っているかを示しvectorます。容量とは、メモリを再割り当てせずに保持できる項目の総数を指しvectorます。reserve()いくつかの要素を追加するつもりで、少しずつ増やしたくないことがわかっている場合は、記憶することができますvector。
ベクトルは空ではありませんが、サイズが 20 (20 個の要素を含む) で、 にpush2 つの要素があるためback、現在 22 個の要素が含まれています。ただし、新しい要素はインデックス 19 と 20 ではなく、20 と 21 に配置されます。
ベクトルが 20 個の要素を保持するのに十分なメモリのみを確保したい (実際には要素を含まない) 場合は、コストのかかる再割り当てを防ぐために、次を呼び出す必要があります。
std::vector<int> myVector;
myVector.reserve(20);
この場合、ベクトルはまだ空ですが、内部ストレージを再割り当てする必要なく、少なくとも 20 個の要素を (push_backたとえば を使用して) 追加するのに十分なメモリがあります。この場合、ベクトルにはpush編集した 2 つの要素のみが含まれます_back。