をインスタンス化しますstd::vector foo(1000)
。
foo.size()
は現在 1000 であり、foo.capacity()
1000 でもあります。
でベクトルをクリアするとfoo.clear()
、size()
は 0 になりましたが、 は何capacity()
ですか? 規格はそれについて何か言っていますか?
いいえ、そうではありません。ベクトルの容量が減少することはありません。これは標準では義務付けられていませんが、VC++ と g++ の標準ライブラリ実装の両方で義務付けられています。サイズに合わせて容量を設定するには、有名なスワップトリックを使用します
vector<T>().swap(foo);
C++11 標準では、より明示的に行うことができます。
foo.shrink_to_fit();
ベクターをクリアして容量をできるだけ消費しないようにするには、スワップ トリックを使用します。
std::vector<T>().swap(foo);
これにより、空のベクターが作成され、その内部が と交換されてfoo
から、一時ベクターが破棄され、かつて属していた要素が取り除かれ、新たに作成されたかのようにfoo
残されます。foo
clear
標準はonの効果について何も述べていませんcapacity
。
いいえ、クリアしても capacity() には影響しません。クリアしても同じままです。収まるようにベクトルを縮小したい場合は、clear を呼び出した後に次のトリックを使用できます: foo.swap(vector(foo));