4

可能であれば、ベクトルのサイズを前もって設定する方が効率的ですか?値をプッシュバックするつもりです。

4

4 に答える 4

8

はい、一般的にはもう少し効率的です。大幅な改善は期待しないでください。ただし、最悪の場合、無害です(明らかに、実際に必要なスペースのみを予約すると仮定します)。

かなり珍しい状況では、所要時間消費スペースの両方が改善される可能性があります。使用するpush_backと、スペースが不足したときにサイズがいくつかの乗法係数で増加しますが、を使用すると、使用reserveする係数の次の倍数に切り上げるのではなく、必要な量が正確に割り当てられる場合があります。

于 2012-04-11T15:24:49.793 に答える
6

を使用.push_back()して値を格納している場合、メンバー関数を使用して「ベクトルのサイズを事前に設定する」ことは正しくありません。むしろ、メンバー関数を使用して、ベクトルの容量を事前に設定します。.resize().reserve()

正しいアプローチは次の3つです。

// 1) Do nothing initially, use .push_back
std::vector<int> v;
v.push_back(1); v.push_back(2);

// 2) Set the capacity initially, use .push_back
std::vector<int> v;
v.reserve(2);
v.push_back(1); v.push_back(2);

// 3) Set the size initiallly, use subscripts
std::vector<int> v(2); // Set the size in construction
v.resize(2);             // OR set the size by a call to .resize()
v[0] = 1; v[1] = 2; 

はい、通常、2番目のアプローチは最初のアプローチよりもサイズと時間の効率が高くなります。

2番目のアプローチは、3番目のアプローチよりも時間効率が良い場合があります。か否か。それが重要かどうかを確認するためにそれを測定する必要があります。

于 2012-04-11T15:42:33.893 に答える
5

はい、通常はスペース(容量)を予約するため、データの連続保存がベクトルによって保証されるため、メモリの割り当てやデータの移動が少なくなります。

于 2012-04-11T15:24:49.330 に答える
1

はい、適切な量のデータを事前に予約できれば、より効率的です。ベクターがその容量に達すると、新しいストレージを割り当てる必要があり、パフォーマンスが低下します。

于 2012-04-11T15:29:52.583 に答える