3

HerbSutter の記事Gotw 54を参照して、彼は次のように説明しています。

  1. ベクターまたは両端キューを「縮小して合わせる」正しい方法と

  2. ベクターまたは両端キューを完全にクリアする正しい方法

container.resize() 上記のタスクにandを使用できますcontainer.clear()か、それとも何か不足していますか?

4

3 に答える 3

6

ベクトルが保持する 2 つの異なるものがあります: sizeVs capacityresizeベクトルだけの場合、容量 (予約されているメモリの量) を変更する必要があるという保証はありません。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

結局、多くのメモリ割り当て/割り当て解除のオーバーヘッドが発生するため、すべての操作で容量を変更するべきではありません。彼は、ベクトルによって予約されたメモリを「解放」する必要がある場合は、それを行うと言っています。

于 2009-11-12T09:24:59.127 に答える
3

resize() も clear() も機能しません。ベクトルのは、少なくともベクトル.capacity()の電流と同じ大きさであることが保証され、少なくともd 容量size()と同じ大きさであることが保証されています。reserve()また、この . capacity()縮小しないため、少なくとも以前のsize()またはreserve()ation と同じ大きさです。

現在、.capacity()ベクトルの は、予約されているメモリにすぎません。多くの場合、そのメモリのすべてがオブジェクトを含むわけではありません。サイズを変更するとオブジェクトが削除されますが、メモリはリサイクルされません。ベクトルは、より大きなバッファーを割り当てる場合にのみ、そのメモリー バッファーをリサイクルできます。

スワップ トリックは、すべてのオブジェクトをより小さく、より適切なメモリ バッファーにコピーすることで機能します。その後、元のメモリ バッファを再利用できます。これは、ベクトルのメモリ バッファーは増加することしかできないという前述のステートメントに違反しているように見えます。ただし、スワップ トリックを使用すると、一時的に2 つのベクトルが得られます。

于 2009-11-12T09:27:11.700 に答える
1

ベクトルにはサイズと容量があります。X 要素を保持している可能性がありますが、Y 要素用に初期化されていないメモリが格納されています。典型的な実装では、erase、resize (より小さなサイズにサイズ変更する場合)、および clear は容量に影響しません。後で新しい項目を追加したい場合に備えて、ベクターはそれ自体のためにメモリを保持します。

于 2009-11-12T09:26:50.873 に答える