90

繰り返す必要がありstd::queueます。www.cplusplus.comによると:

デフォルトでは、特定のキュークラスにコンテナクラスが指定されていない場合、標準のコンテナクラステンプレートdequeが使用されます。

それで、どういうわけか、キューの基になる両端キューに到達して、それを反復処理できますか?

4

10 に答える 10

79

を反復処理する必要がqueueある場合は、キュー以上のものが必要です。標準コンテナ アダプタのポイントは、最小限のインターフェイスを提供することです。繰り返しも行う必要がある場合は、代わりに deque (またはリスト) を使用してみませんか?

于 2009-08-11T08:49:44.383 に答える
39

反復可能なコンテナーを直接使用することが推奨されるソリューションであることに同意しますが、C ++標準は、何らかの理由で必要な場合に備えて、日曜大工のソリューションを十分にサポートすることを保証します。

つまり、std::queue保護されたメンバーContainer c;を継承して使用し、基になるコンテナのbegin()およびend()にアクセスできます(そのようなメソッドがそこに存在する場合)。VS 2010で動作し、ideoneでテストされた例を次に示します。

#include <queue>
#include <deque>
#include <iostream>

template<typename T, typename Container=std::deque<T> >
class iterable_queue : public std::queue<T,Container>
{
public:
    typedef typename Container::iterator iterator;
    typedef typename Container::const_iterator const_iterator;

    iterator begin() { return this->c.begin(); }
    iterator end() { return this->c.end(); }
    const_iterator begin() const { return this->c.begin(); }
    const_iterator end() const { return this->c.end(); }
};

int main() {
    iterable_queue<int> int_queue;
    for(int i=0; i<10; ++i)
        int_queue.push(i);
    for(auto it=int_queue.begin(); it!=int_queue.end();++it)
        std::cout << *it << "\n";
    return 0;
}
于 2011-05-12T20:39:57.870 に答える
5

One indirect solution can be to use std::deque instead. It supports all operations of queue and you can iterate over it just by using for(auto& x:qu). It's much more efficient than using a temporary copy of queue for iteration.

于 2019-12-10T18:29:45.393 に答える
2

反復したいキューのコピーを作成し、アイテムを一度に 1 つずつ削除して、それらを印刷してみませんか? 繰り返しながら要素をさらに処理したい場合、キューは間違ったデータ構造です。

于 2012-12-04T21:58:23.460 に答える
-1

要するに:いいえ。

ハックがあり、ベクターをアンダーレイ コンテナーとして使用するため、queue::front有効な参照を返し、それをポインターに変換し、<= まで反復します。queue::back

于 2009-08-11T08:51:37.953 に答える
-2

std::queueはコンテナー アダプターであり、使用するコンテナーを指定できます (デフォルトでは を使用しますdeque)。アダプタでそれ以上の機能が必要な場合は、dequeまたは別のコンテナを直接使用してください。

于 2012-12-04T15:55:52.037 に答える
-2

キューを反復する必要がある場合...キューは必要なコンテナではありません。
なぜキューを選んだのですか?
繰り返し処理できるコンテナーを使用してみませんか?


1.キューを選択した場合、コンテナを「キュー」インターフェースにラップしたいとします: - フロント - バック - プッシュ - ポップ - ...

繰り返したい場合は、キューのインターフェースが正しくありません。キューは、元のコンテナーの制限されたサブセットを提供するアダプターです

2.キューの定義はFIFOであり、定義によりFIFOは反復可能ではありません

于 2009-08-11T08:52:43.207 に答える