質問

私はstd::queueを反復する必要があります。 www.cplusplus.com氏は述べています:

  何のコンテナクラスは、特定のキュークラスに指定されていない場合は、

デフォルトでは、標準のコンテナクラステンプレートの両端キューが使用されます。

だから私は何とかキューの根底にある両端キューを取得し、それを反復処理することができますか?

役に立ちましたか?

解決

あなたは、あなたがキュー以上の何かが必要queueを反復処理する必要がある場合。標準容器アダプタの点は、最小限のインターフェースを提供することです。あなたが同様に反復実行する必要がある場合は、その理由だけでデック(またはリスト)を使用しない代わりに?

他のヒント

私は、反復可能なコンテナの直接の使用が好ましい解決策であることを他の人と同意する一方で、

、私はC ++標準ことを指摘したいあなたはどのような理由のためにそれをしたい場合は日曜大工・ソリューションのための十分なサポートを保証します。

つまり、あなたがstd::queue継承とその下にあるコンテナの()()とendを開始アクセスするために、その保護されたメンバーのContainer c;を使用することができます(このような方法が存在している場合)。ここでは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;
}

あなたは一時的なキューに、元のキューを保存することができます。そして、あなたは、単にたとえば、オリジナルのものを通過するために、一時的なキューに通常のポップを行います:

queue tmp_q = original_q; //copy the original queue to the temporary queue

while (!tmp_q.empty())
{
    q_element = tmp_q.front();
    std::cout << q_element <<"\n";
    tmp_q.pop();
} 

終わりに、tmp_qは空になりますが、元のキューが変更されません。

なぜあなたが反復処理するキューのコピーを作成し、一度に項目1を削除し、あなたが行くようにそれらを印刷していませんか?あなたが反復としての要素をよりやりたい場合は、キューは、間違ったデータ構造です。

アレクセイKukanovの答えには、より効率的かもしれないが、

、あなたはまた、それぞれが飛び出ることで、非常に自然な方法でキューを反復処理することができますキューの先頭から要素、そして背中にそれを押します:

#include <iostream>
#include <queue>

using namespace std;

int main() {
    //populate queue
    queue<int> q;
    for (int i = 0; i < 10; ++i) q.push(i);

    // iterate through queue
    for (size_t i = 0; i < q.size(); ++i) {
        int elem = std::move(q.front());
        q.pop();
        elem *= elem;
        q.push(std::move(elem));
    }

    //print queue
    while (!q.empty()) {
        cout << q.front() << ' ';
        q.pop();
    }
}

出力:

0 1 4 9 16 25 36 49 64 81 
キューを反復処理する必要がある場合は、

...キューは、あなたが必要とコンテナではありません。
なぜあなたは、キューを選択しましたか?
あなたが反復処理できるコンテナを取らないのはなぜ?

<時間> あなたは、キューを選ぶ1.if

あなたは「キュー」インターフェイスにコンテナをラップしたいと言います。     - フロント      - バック     - 押す     - ポップ      - ...

あなたはまた、反復処理したい場合は、

、キューが間違ったインターフェースを持っています。キューは、元の容器の制限されたサブセットを提供するアダプタである

キューの2.定義はFIFOであると定義によってFIFOは反復可能ではありません。

私はこのようなものを使用します。非常に洗練されていないが、動作するはずです。

    queue<int> tem; 

    while(!q1.empty()) // q1 is your initial queue. 
    {
        int u = q1.front(); 

        // do what you need to do with this value.  

        q1.pop(); 
        tem.push(u); 
    }


    while(!tem.empty())
    {
        int u = tem.front(); 
        tem.pop(); 
        q1.push(u); // putting it back in our original queue. 
    }
あなたはQ1から何かをポップし、TEMにそれを押すと、それはTEMの最初の要素となりますので、

これは動作します。だから、最後のTEMでQ1のレプリカになります。

要するに:なし

がありハック、下敷き容器として使用ベクトルであるので、queue::frontは<= queue::back

std::queueは、コンテナアダプタで、あなたは(これはデフォルトではdequeを使用する)を使用した容器を指定することができます。あなたは、アダプタにその超えた機能が必要な場合は、ちょうどdequeまたは直接、別の容器を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top