109 votes

Itération de la file d'attente STL

Je dois parcourir une file d'attente. www.cplusplus.com dit: Par défaut, si aucune classe de conteneur n'est spécifiée pour une classe de file d'attente particulière, le modèle de classe de conteneur standard est utilisé.

Donc, puis-je en quelque sorte accéder au deque sous-jacent de la file d'attente et l'itérer dessus?

92voto

Charles Bailey Points 244082

Si vous devez parcourir plus de queue vous avez besoin de quelque chose de plus qu'une file d'attente. L’intérêt des adaptateurs de conteneur standard est de fournir une interface minimale. Si vous devez également effectuer une itération, pourquoi ne pas simplement utiliser un deque (ou une liste) à la place?

46voto

Alexey Kukanov Points 6128

Alors que je suis d'accord avec les autres que l'utilisation directe d'un objet iterable conteneur est une solution préférée, je tiens à souligner que la norme C++ garantit suffisamment de soutien pour un do-it-yourself solution dans le cas où vous le souhaitez pour quelque raison que ce soit.

À savoir, vous pouvez hériter std::queue et l'utilisation de ses membres protégés Container c; d'accès begin() et end() du conteneur sous-jacent (à condition que de telles méthodes existent). Voici un exemple qui fonctionne dans VS 2010 et testé avec 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;
}

2voto

Chuck Points 11

Pourquoi ne pas simplement faire une copie de la file d'attente sur laquelle vous souhaitez effectuer une itération et supprimer les éléments un à un en les imprimant au fur et à mesure? Si vous voulez faire plus avec les éléments pendant votre itération, une file d'attente est une structure de données incorrecte.

1voto

Dewfy Points 11277

En bref: Non Il y a un hack, utilisez vector comme conteneur sous-jacent, donc queue :: front retournera une référence valide, le convertira en pointeur et itérera jusqu'à ce que <= queue :: back

-2voto

TimW Points 5715

Si vous avez besoin d'itérer une file d'attente ... la file d'attente n'est pas le conteneur dont vous avez besoin.
Pourquoi avez-vous choisi une file d'attente?
Pourquoi ne pas vous prendre un récipient que vous pouvez parcourir?


1.si vous choisissez une file d'attente puis vous dites que vous voulez pour envelopper un récipient dans une "queue" de l'interface: - avant - retour - push - pop - ...

si vous aussi vous souhaitez effectuer une itération, une file d'attente a une mauvaise interface. Une file d'attente est un adaptateur qui fournit un sous-ensemble restreint de l'emballage d'origine

2.La définition d'une file d'attente est une FIFO et, par définition, une FIFO n'est pas itérable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X