2012-04-29 11 views
0

可能性の重複:
C++:STDを有する予約領域を削減::ベクトル::リザーブ

How to downsize std::vector?

cppreferenceによれば、STDで::ベクトル::リザーブは(size_t n)が、nは「割り当てられたストレージの容量として必要な最小量」です。私の質問は、どのように最大限しか知りません再割り当てを避けるためには?

例として、整数リストがあるとしますが、このリストのサイズはわかりません(たとえば、このリストはファイルの読み込みに由来します)。しかし、このリストの最大サイズは1000であることがわかります。リストの実際のサイズが800であるとしましょう。

現在、私はstd :: reserve(1000)を使用してからpush_back() 。予備を使用すると、再割り当てができなくなります。しかし、push_backsの最後に余分なスペースを解放する方法はありますか? (例の場合、1000-800 = 200余分なスペースを解放する方法)

ありがとうございました。

答えて

3

あなたはそれが重複した質問ですstd::vector::shrink_to_fit()

std::vector<int> v; 
v.reserve(1000); 
for(int i=0;i<800;++i) 
    v.push_back(10); 

v.shrink_to_fit(); 
+1

C++ 11のサポートが必要です。そして、何かを縮小することは保証されていません。 –

+0

@ NicolBolasはい、標準ではバインドされていないリクエストであり、「注:リクエストは実装固有の最適化のために緯度を許すためにバインドされていません」と記載されています。品質の実装が容量を調整しないことを選択できる例は、現在の容量がすでに十分に小さく、コンテナが小さな文字列最適化のようなものを利用している場合です。 – bames53

1

新しいベクターを正しいサイズで作成し、2つのベクターの内容を交換する必要があります。幸いなことに、ワンライナーだSTLにここでの例です:How to downsize std::vector?

+3

だから... ...を使用することができます。 – Potatoswatter

関連する問題