14

重複の可能性:
std ::vector<T>の代わりにstd::list <T>を使用するのはいつですか?

ビャーネ・ストロヴルプによるGoingNative'12トークの録音を見たところです。そして、私は少し混乱しています。

この講演では、特にvectorvsの質問について説明し、コンパイラーはコンパクトな構造のように多くのことを最適化できるため、多くの場合、途中で集中的に挿入および削除しても高速でlistあると示唆しています。vectorそして結論は(私が理解しているように)次のとおりです。最初に使用vectorし、後で何か他のものが必要かどうかを考えます。それは合理的に聞こえますが、最初の観察を考慮に入れると、どのような基準を考慮に入れる必要がありますか?集中的に挿入/削除する場合は、リストを使用することを常に考えていました。ここのいくつかのトピックでも同様のことが示唆されています。見る

std::vector対std::list対std::slistの相対的なパフォーマンス?

STLのベクトルとリスト

そして今、Stroustrupによれば、私は間違っていました。

もちろん、私はいくつかのテストを書いて、それぞれの特定の状況で何を使用するかを理解しようとすることができますが、理論的な方法はありますか?

4

1 に答える 1

18

std::list優先する最も重要な動機は、パフォーマンスではなくstd::vector、反復子の有効性です。挿入または消去しているときにコンテナに他のイテレータがある場合、挿入はイテレータを無効にせず、消去は消去される要素へのイテレータのみを無効にするため、おそらく が必要です。パフォーマンスが向上するのは、コピーと代入のコストが非常に高い場合のみです。このような場合は、に切り替えるよりも、含まれているクラスを変更してコピーと代入のコストを削減する方がよい場合がよくあります。std::liststd::liststd::list

于 2012-11-01T10:09:50.290 に答える