Bjarne Stroustrup の Going Native 2012 基調講演のスライドによると、最新のハードウェアでは a への挿入と削除は非常に非効率的です。std::list
挿入と削除では、ベクトルがリストを大幅に上回る
これが本当なら、どのようなユースケースが残されていstd::list
ますか? それなら非推奨にすべきではないですか?
ベクトルとリストは、さまざまな問題を解決します。List は、他の要素を挿入および削除するときにイテレータが無効にならないことを保証します。ベクターはそれを保証しません。
パフォーマンスがすべてではありません。したがって、答えはノーです。リストは廃止されるべきではありません。
編集これを超えて、C++ は「最新のハードウェア」だけで動作するようには設計されていません。それよりもはるかに広い範囲のハードウェアで役立つように意図されています。私は金融業界のプログラマーであり、C++ を使用していますが、組み込みデバイス、プログラマブル コントローラー、人工心肺などの他の分野も同様に重要です。C++ 言語は、特定のドメインのニーズや特定のクラスのハードウェアのパフォーマンスだけを考慮して設計するべきではありません。私がリストを使用しないかもしれないからといって、それが言語から廃止されるべきだという意味ではありません。
ベクトルがリストよりも優れているかどうかは、要素のタイプにも依存します。たとえば、int
ほとんどのデータが CPU キャッシュ内に収まり、データのコピーに SIMD 命令を使用できるため、要素ベクトルは非常に高速です。したがって、ベクトルの O(n) 複雑さはあまり影響しません。
しかし、コピーがストリーム操作に変換されず、代わりにあらゆる場所からデータを取得する必要がある、より大きなデータ型についてはどうでしょうか? また、大規模な CPU キャッシュを持たず、おそらく SIMD 命令も欠いているハードウェアについてはどうでしょうか? C++ は、最新のデスクトップやワークステーション マシンだけでなく、はるかに多くのマシンで使用されています。std::list の廃止は問題外です。
そのプレゼンテーションで Stroustrup が言っていることは、データに std::list を選択する前に、それが特定の状況に適した選択であることを確認する必要があるということです。つまり、ベンチマークとプロファイルです。常に std::vector を選択する必要があるとは絶対に言いません。
いいえ、特に 1 つの特定のグラフに基づいていません。リストの方がベクターよりもパフォーマンスが優れている場合があります。参照: http://www.baptiste-wicht.com/2012/12/cpp-benchmark-vector-list-deque/
他の人が述べたように、それはパフォーマンス以外の違いを無視しています。
その話での Bjarne のポイントは、リストを使うべきではないということではありませんでした。それは、リストのパフォーマンスについて人々があまりにも多くの仮定を立て、それがしばしば間違っていることが判明したためです。彼は単に、リストのパフォーマンスやその他のセマンティック特性の必要性が実際に見つからない限り、ベクトルを常にデフォルトのコンテナー タイプにするべきだというスタンスを正当化していました。
もちろん違います。std::list は別のデータ構造です。異なるデータ構造を比較すると、その特性、長所または短所がよくわかります。しかし、それぞれのデータ構造には利点があります。