質問
以前に予約したスペースが不要になったときに、 std :: vector
のサイズを変更して容量を減らす方法はありますか?
解決
効果的なSTL、Scott Meyers、アイテム17: swap
トリックを使用して、余分な容量を削減します。
vector<Person>(persons).swap(persons);
その後、 persons
は「収まるように縮小」します。
これは、 vector
のコピーコンストラクターが、コピーされる要素に必要なだけのメモリを割り当てるという事実に依存しています。
他のヒント
C ++ 11を使用している場合、 vec.shrink_to_fit()
を使用できます。少なくともVS2010では、これでスワップトリックが実行されます。
既存のベクターから新しい一時的なベクターを作成し、既存のベクターでスワップメソッドを呼び出して、一時的なベクターを渡します。一時的な(現在は古い、サイズの大きい)バッファーをスコープ外にします。
ねえ、あなたのベクターはその内容にぴったりのサイズを持っています。
これが多くのコピーと割り当てのように聞こえる場合-これはベクターが現在の予約済みの制限を超えて再割り当てしなければならないたびに何をするかを覚えておいてください。
[編集] はい、セバスチャンと同じことをもっと言いました。 stackoverflow race-conditionの別のケース;-)
スワップトリックは、オブジェクトの容量を削減する効果的な方法です。 ベクターのコンテンツを、コピー作成によって新しく作成されたものと交換します。
vector<Person>(persons).swap(persons);
persons.capacity();の保証がないことに注意してください。スワップトリックが等しい後 サイズ:vector(persons)の容量はライブラリ実装の容量です サイズがperson.size()のベクターに予約されています。
C ++ 11で shrink_to_fit()が導入されました。
>shrink_to_fit()およびスワップトリックは、容量サイズが効果的になることを保証しません ベクトルのサイズに縮小。
とにかくshrink_to_fit()は、イテレータを無効にすることができます(再割り当てが発生した場合)またはできない: ライブラリの実際の実装に依存します。
スワップトリックにはperson.size()のPersonの構造のコピーが必要であり、 person.size()破壊。 shrink_to_fit()は、このコピーをすべて回避し、 イテレータは有効のままにしてください。できた。しかし、ときどきshrink_to_fit()が実装されることがあります スワップトリックの条件...
QVector :: squeeze そして、私はそれがSTLに明示的に存在しないことを恐れています。 STLの実装に正しい場合は、S&#233; bastienの答えを探してください。