HerbSutter の記事Gotw 54を参照して、彼は次のように説明しています。
ベクターまたは両端キューを「縮小して合わせる」正しい方法と
ベクターまたは両端キューを完全にクリアする正しい方法
container.resize()
上記のタスクにandを使用できますcontainer.clear()
か、それとも何か不足していますか?
ベクトルが保持する 2 つの異なるものがあります: size
Vs capacity
。resize
ベクトルだけの場合、容量 (予約されているメモリの量) を変更する必要があるという保証はありません。resize
ベクトル容量の量ではなく、使用量に関係する操作です。
たとえば。
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
結局、多くのメモリ割り当て/割り当て解除のオーバーヘッドが発生するため、すべての操作で容量を変更するべきではありません。彼は、ベクトルによって予約されたメモリを「解放」する必要がある場合は、それを行うと言っています。
resize() も clear() も機能しません。ベクトルのは、少なくともベクトル.capacity()
の電流と同じ大きさであることが保証され、少なくともd 容量size()
と同じ大きさであることが保証されています。reserve()
また、この . capacity()
縮小しないため、少なくとも以前のsize()
またはreserve()
ation と同じ大きさです。
現在、.capacity()
ベクトルの は、予約されているメモリにすぎません。多くの場合、そのメモリのすべてがオブジェクトを含むわけではありません。サイズを変更するとオブジェクトが削除されますが、メモリはリサイクルされません。ベクトルは、より大きなバッファーを割り当てる場合にのみ、そのメモリー バッファーをリサイクルできます。
スワップ トリックは、すべてのオブジェクトをより小さく、より適切なメモリ バッファーにコピーすることで機能します。その後、元のメモリ バッファを再利用できます。これは、ベクトルのメモリ バッファーは増加することしかできないという前述のステートメントに違反しているように見えます。ただし、スワップ トリックを使用すると、一時的に2 つのベクトルが得られます。
ベクトルにはサイズと容量があります。X 要素を保持している可能性がありますが、Y 要素用に初期化されていないメモリが格納されています。典型的な実装では、erase、resize (より小さなサイズにサイズ変更する場合)、および clear は容量に影響しません。後で新しい項目を追加したい場合に備えて、ベクターはそれ自体のためにメモリを保持します。