30

をインスタンス化しますstd::vector foo(1000)

foo.size()は現在 1000 であり、foo.capacity()1000 でもあります。

でベクトルをクリアするとfoo.clear()size()は 0 になりましたが、 は何capacity()ですか? 規格はそれについて何か言っていますか?

4

4 に答える 4

29

いいえ、そうではありません。ベクトルの容量が減少することはありません。これは標準では義務付けられていませんが、VC++ と g++ の標準ライブラリ実装の両方で義務付けられています。サイズに合わせて容量を設定するには、有名なスワップトリックを使用します

vector<T>().swap(foo);

C++11 標準では、より明示的に行うことができます。

foo.shrink_to_fit();
于 2011-07-30T11:28:04.050 に答える
5

ベクターをクリアして容量をできるだけ消費しないようにするには、スワップ トリックを使用します。

std::vector<T>().swap(foo);

これにより、空のベクターが作成され、その内部が と交換されてfooから、一時ベクターが破棄され、かつて属していた要素が取り除かれ、新たに作成されたかのようにfoo残されます。foo

于 2011-07-30T11:53:26.063 に答える
2

clear標準はonの効果について何も述べていませんcapacity

于 2011-07-30T11:27:25.067 に答える
0

いいえ、クリアしても capacity() には影響しません。クリアしても同じままです。収まるようにベクトルを縮小したい場合は、clear を呼び出した後に次のトリックを使用できます: foo.swap(vector(foo));

于 2011-07-30T11:26:24.580 に答える