3

std::queue、デフォルトでdequeを使用して実装されます。std::deque添え字演算子、、があり、operator[]おそらく配列で実装されています。では、なぜstd::queue持っていないのoperator[]ですか?

基になるコンテナとしてリストを含むキューを作成できると思います。(std::queue<int, std::list<int>>。)しかし、それによって添え字演算子が遅くなるとしても、それを含めないのは本当に正当な理由ですか?それが含まれていないと私が考えることができる唯一の理由です。

4

4 に答える 4

8

キューの定義がそのようなインターフェースをサポートしていないためです。キューは先入れ先出しを意味する FIFO データ構造です。Queue は、エンキューおよびデキュー 操作をサポートします。

キューをパイプとして想像してみてください。一方の端にデータを挿入し、もう一方の端からデータを 1 つずつ取り出します。データを挿入することをエンキュー、取り出すことをデキューと呼びます。C++ 標準ライブラリにstd::queueは、これらの両方の操作が定義されています。 はエンキュー操作の名前でありpush()、デキュー操作は 2 つのステップに分割されています。デキューが 2 つのステップに分割された理由は、強力な例外保証1を与えるためです。front()pop()

ウィキペディアはこれを簡単に説明します、

キューは、コレクション内のエンティティが順番に保持される特定の種類のコレクションであり、コレクションに対する主要な (または唯一の) 操作は、後端位置へのエンティティの追加と、前端位置からのエンティティの削除です。これにより、キューは先入れ先出し (FIFO) データ構造になります。FIFO データ構造では、キューに最初に追加された要素が最初に削除されます。これは、要素が追加されると、新しい要素を呼び出す前に、以前に追加されたすべての要素を削除する必要があるという要件に相当します。キューは線形データ構造の一例です。

1. 強力な例外保証がどの程度正確に提供されるかを知りたい場合は、別のトピックを開始できます。これは非常に長い話であり、適切に理解するには多くの忍耐が必要なためです。これについては、Herb Sutter による Exceptional C++ を読むことをお勧めします。

于 2011-08-31T19:05:31.147 に答える
4

コンセプトの問題です。キューでは、真ん中からではなく、後ろに追加して前から取る

于 2011-08-31T19:08:42.727 に答える
3

これを含めない理由は、キューはランダム アクセスではなく、エンキューおよびデキュー操作を伴うデータ構造であるためです。std::queue既存のコンテナーをキュー インターフェースに適合させるために存在するため、キュー インターフェースのみを提供します。

于 2011-08-31T19:07:26.230 に答える