web-dev-qa-db-ja.com

std :: queueがclear()関数をサポートしないのはなぜですか?

このような要件があります。関数の場合、入力は数値のストリームとして取得されます。つまり、関数は各呼び出しで単一の番号で呼び出され続けます。数値のストリームを格納するためにキューを使用しています。収集された一連の数値を処理する必要があるのは、何らかの条件が満たされた場合のみです。条件が満たされない場合は、キュー内のすべての要素をスローしてから、その中に新しい番号を格納し始める必要があります。キューを空にするために、clear()メソッドが見つかりませんでした。だから私は以下のようにループしています。

while(!q.empty())
    q.pop();

でキューをクリアするための効率的なアルゴリズムを取得しました

std :: queueを効率的にクリアするにはどうすればよいですか?

私の質問は:キューがclear()関数をサポートしないのはなぜですか?

Dequeとvectorがclear()メソッドをサポートしている場合、キューでサポートすることの技術的な難しさは何ですか?

または、上記のユースケースは非常にまれであるため、サポートされていませんか?ありがとうございました。

26
bjskishore123

http://www.cplusplus.com/reference/stl/queue/ によると、

キューはコンテナーアダプターとして実装されます。コンテナーアダプターは、特定のコンテナークラスのカプセル化されたオブジェクトを基になるコンテナーとして使用し、その要素にアクセスするための特定のメンバー関数のセットを提供します。

つまり、キューは既存のコンテナを使用し、実際にはFIFOキューとしてのこのコンテナへのインターフェイスです。

これは、キューがクリアされることを意図していないことを意味します。キューをクリアする必要がある場合、これは実際にはキューではないオブジェクトを使用する必要があることを意味します。したがって、代わりに、デフォルトで両端キューである実際の基になるコンテナタイプを使用する必要があります。

20
SirDarius

すでに言われていることとは別に、あなたはcan非常に簡単にキューをクリアします:

queue<int> q;
...
q = queue<int>(); // Assign an empty queue

またはC++ 11で

q = {};
26
sellibitze

queueは、基礎となるコンテナの単なるアダプタであり、デフォルトではdequeであり、機能が制限されています(ここで説明したように)。本格的な関数が必要な場合は、dequeの代わりに基礎となるqueueを使用してください。

3
Steve Townsend

これを「STLを読みやすくする」関数の増え続けるリストに追加しました。

template <typename T> 
void Clear(std::queue<T>& Queue) 
{
    Queue = std::queue<T>(); // Assign to empty queue
}

これは、sellibitzeの優れた回答のラッパーにすぎませんが、この手法を使用するたびにコメントを追加する必要がないことを意味します。

2
Andy Krouwel