17

重複の可能性:
std::vectorのサイズを下に変更

現在のサイズよりも小さいサイズの場合、ベクターが新しいメモリを割り当てる可能性はありますかresize()std::vector

これは、パフォーマンス上の理由から私にとって重要です。

4

5 に答える 5

14

No, resizeing to a smaller size will never reallocate.

In case the container shrinks, all iterators, pointers and references to elements that have not been removed remain valid after the resize and refer to the same elements they were referring to before the call.

(From here)

Given that, we can be sure that a reallocation cannot have happened.

于 2013-01-14T14:09:52.420 に答える
7

resize()縮小すると、論理サイズのみが変更されます。他の人がすでにこれに答えているので、ここでは何も追加しません。これの目的は、データを再割り当てまたは移動する必要がないため、速度を最適化することです。

ただし、メモリ使用量を最適化したい場合、C++ 11 には、必要のないメモリにお金を払わなくて済むように、メモリの使用shrink_to_fit()後に (またはいつでも) 呼び出すことができる追加の関数が導入されています。 resize().

于 2013-01-14T14:55:04.523 に答える
2

No. The vector will never, ever shrink it's memory, except in a few quite specific conditions. Remember that when the vector resizes, iterators are invalidated, so it cannot go around doing this behind your back- it's an observable change, and the Standard specifies exactly when this may or may not happen.

于 2013-01-14T14:10:24.433 に答える
1

いいえ。

Vector はsizecapacityの 2 つの値を使用します。サイズはベクトルに格納されている要素の実際の数であり、容量はメモリ内に割り当てられた予約済みスペースを表します。パフォーマンスの向上は、必要以上のスペースを割り当てることによってもたらされます。

現在の容量よりも大きな容量になるサイズ変更の要求が実行された場合にのみ、再割り当てが行われます。また、ベクトルの途中に多くの要素を挿入しようとすると、挿入された要素の後のすべての要素を移動する必要があるため、アルゴリズムのパフォーマンスに影響を与えます (場合によっては、これにより、ベクトルの容量を超えた場合に再割り当てがトリガーされる可能性があります)。ベクター)。

予約メンバー関数を使用して速度をさらに上げることができます。予約メンバー関数は、容量が特定の値に設定されていることを確認します。

std::vector の詳細については、148 ページの The C++ Standard Library: A Tutorial and Reference を参照してください。

于 2013-01-14T14:16:36.347 に答える
0

まず、最適化したいものを測定する必要があります。パフォーマンスだけでは不十分です。どういう意味ですか? UI の反応性 ? 時間を測定するための典型的なユーザー アクションが必要です。重いアルゴリズム?など...次に、ボトルネックがどこにあるかを見つける必要があります。メモリ、ディスクアクセスなどである可能性があり、最後に vector::resize である可能性がありますが、最後にのみです! そして、あなたがあなたの質問をする方法、私は $ に賭けます vector::resize はボトルネックにはなりません。

STL の設計方法に自信を持ち、STL の動作を変更する前にコードを確認してください ;-)

于 2013-01-14T15:00:52.950 に答える