5

C++11 より前の時代、多くの本の著者は、dequeランダム アクセスで動的にサイズ変更されたコンテナーが必要な状況で for を使用することを推奨していました。これは、一部には、 がdequeよりも汎用性の高いデータ構造に移動vectorしたという事実によるものでしたが、vectorC++11 以前の世界では、"shrink toフィット。" ブラケットdeque演算子と反復子を介した要素への間接アクセスのオーバーヘッドの増加vectorは、再割り当てのオーバーヘッドの増加に含まれているようです。

一方で、変わらないものもあります。vector再割り当てには引き続き幾何学的 (つまり、サイズ * 係数) スキームを使用し、すべての要素を新しく割り当てられたスペースにコピー (または可能であれば移動) する必要があります。vector前部および/または中間部での要素の挿入/削除に関しては、以前と同じです。一方、参照の局所性は向上しますが、使用されるブロックdequeが「かなり大きな」サイズである場合、キャッシュに関する利点は多くのアプリで主張できます。

したがって、私の質問は、C++ 11 に伴う変更を考慮してdeque、動的にサイズ設定された/ランダムアクセスのニーズに対応するための最初の選択肢のコンテナーであり続ける必要があるかどうかです。

4

2 に答える 2

4

Josuttis の The C++ Standard Library には次のように記載されています。

デフォルトでは、vectorを使用する必要があります。最も単純な内部データ構造を持ち、ランダム アクセスを提供します。したがって、データ アクセスは便利で柔軟であり、データ処理は多くの場合十分に高速です。

シーケンスの最初と最後で頻繁に要素を挿入および/または削除する場合は、dequeを使用する必要があります。要素が削除されたときにコンテナーが使用する内部メモリの量を縮小することが重要な場合は、deque も使用する必要があります。また、ベクトルは通常、その要素に 1 つのメモリ ブロックを使用するため、deque は複数のブロックを使用するため、より多くの要素を含めることができる場合があります。

于 2013-08-07T15:49:21.610 に答える