3

ベクトルのベクトルがあるとしましょう

vector< vector<int> > bigTable;

bigTable.reserve(5);

サイズ変更と予約についての私の理解を明確にするため。

ベクトルで push_back を使用する場合、使用するたびにメモリを割り当てる必要があります。したがって、私の目標は、メモリ空間のセットを脇に置いて、コストが最も低くなるようにすることです。

そのため、予約は上記の目標に役立ちますか?

4

1 に答える 1

1

を呼び出すたびにメモリを割り当てる必要はありませんpush_back。ベクターは特定の容量で開始し、通常は前の容量を 2 倍にして、元の容量がなくなったときにのみ追加の容量を割り当てます。追加容量が必要になることが確実な場合にのみ予約してください。また、容量メンバーを使用して、開始時の容量を確認できます。したがって、はい、への電話reserveが役立ちますが、追加の容量が本当に必要であることを最初から知っている場合に限ります. しかし、ベクターが必要なときにその容量を増やすことも信頼できます。

私の特定のプラットフォームでは、5 つFooの要素でベクターを初期化すると、容量が 5 になります。新しい要素を追加すると、容量が 10 に跳ね上がります。これは標準では義務付けられていないため、元の容量は 5 をはるかに超えていた可能性があります。 .

struct Foo {
  long long n;
};

int main() {

  std::vector<Foo> f(5);
  std::cout << f.capacity() << "\n";
  f.push_back(Foo());
  std::cout << f.capacity() << "\n";

}
于 2012-05-07T18:06:03.590 に答える