Comment effectuer une itération sur un priority_queue?
Puis-je traverse une norme priority_queue
ou standard queue
en c++ avec un itérateur (comme un vector
)? Je ne veux pas utiliser le protocole pop parce qu'il la cause de mon file d'attente pour être retiré.
Merci pour toute aide
Vous devez vous connecter pour publier un commentaire.
priority_queue
ne permet pas d'itération dans tous les membres, sans doute parce que ce serait trop facile en effet d'invalider la priorité de commande de la file d'attente (en modifiant les éléments qui vous traverse) ou peut-être que c'est un "pas mon métier" justification.Officiel de contournement consiste à utiliser un
vector
la place et de gérer la priorité-ness-vous avecmake_heap
,push_heap
etpop_heap
. Une autre façon de contourner ce, dans @Richard réponse, est d'utiliser une classe dérivée depriority_queue
d'accès et le stockage sous-jacent qui aprotected
visibilité.Vous pouvez le faire comme ceci - bam! Notez que les éléments ne sont pas nécessairement en "triés" ordre pendant qu'ils sont dans la file d'attente, au moins en ce qui concerne une simple itération du conteneur.
std:: containers
est dangereux et mauvais parce qu'ils manquent de destructeur virtuel?Un
queue
délibérément fournit une interface limitée, ce qui exclut l'itération. Mais depuis unqueue
utilise undeque
que le conteneur sous-jacent, pourquoi ne pas utiliser undeque
directement?Similaire réponse pour une file d'attente de priorité: non, vous ne pouvez pas. Dans ce cas cependant, un
vector
est utilisé par défaut. Dans les deux cas, pouvez-vous accéder au conteneur sous-jacent pour itérer sur eux. Voir cette question pour plus de lecture.Oui, faire une copie de la priority_queue et parcourir plus de cela.
Ce n'est pas possible. Vous devez utiliser un autre récipient, sans doute un
deque
permettrait de mieux vous servir.J'ai trouvé ce après avoir trébuché à travers votre question. Il y a un moyen très simple de le faire par écrit une mise en œuvre héritant de std::priority_queue. Il est tout de 14 lignes.
http://www.linuxtopia.org/online_books/programming_books/c++_practical_programming/c++_practical_programming_189.html
Les files d'attente sont totalement différents vecteurs et sont utilisées à différentes fins. Files d'attente de priorité sont tout simplement triés deques ayant pas un accès direct à l'arrière. Toutefois, si vous voulez désespérément de faire ce pour quelle que soit la méthode, ce que vous pouvez faire est de faire apparaître le haut/de l'élément avant, l'ajouter à une liste/matrice/vecteur, puis appuyez sur l'élément dans votre file d'attente pour(size_t i = 0; i < q.size(); i++). J'ai pris une classe en java structures de données, et voilà la réponse à la question d'examen. En Plus, c'est la seule méthode que je pense.
Beaucoup de ces réponses reposent sur la codification, à l'aide de beaucoup de C++ arcanes de fonctionnalités. C'est ok, de plaisir et de fonds chers programmeurs. Une solution immédiate qui est rapide, pas cher à programme, mais plus cher à utiliser est:
Par la façon dont il semble tout à fait non-raisonnable de ne PAS fournir un itérateur pour un priority_queue, surtout quand c'est une classe de conteneur pour l'une ou de la structure.
J'ai eu la même question que moi-même. J'ai trouvé que c'était très difficile, peut-être impossible, d'obtenir à la structure de données sous-jacente de la file d'attente de priorité. Dans mon cas, cela a été un vecteur d'objets.
Cependant, j'ai fini à l'aide d'une bibliothèque de modèles standard tas. Il est presque aussi facile que de une file d'attente de priorité (il faut deux instructions push et pop, contre 1 pour le pq), sinon le comportement semble être identique
et
Je peux obtenir à la structure de données sous-jacente si je ne la modifiez pas.
C++ priority_queue n'offre pas une .begin() pointeur (comme vecteur de le faire) que vous pouvez utiliser pour effectuer une itération sur elle.
Si vous souhaitez effectuer une itération sur la file d'attente de priorité à la recherche pour savoir si elle contient une valeur, alors peut-être créer un wrapper file d'attente de priorité et d'utiliser un hachage ensemble pour garder une trace de ce que vous avez dans la file d'attente.
Pour objectifs de base, un
std::multiset
vous donnera des propriétés similaires, mais avec la possibilité d'itérer:Less
peut être définieJ'ai eu le même problème, lorsque j'ai voulu effectuer une itération sur une file d'attente de priorité sans file d'attente (et donc de détruire ma file d'attente). J'ai fait le travail pour moi par la refonte de mon priority_queue pointeur vers un pointeur vers un vecteur (comme mon
priority_queue
utilise comme vecteur de son contenant). Voici à quoi ça ressemble:Maintenant, depuis que je suis en utilisant reinterpret_cast, les gens peut discuter sur le type de sécurité. Mais dans ce cas je suis sûr de toutes les autres fonctions d'accès/modification de la file d'attente (qui sont sûr).. et j'ai l'impression que c'est beaucoup mieux que de copier le contenu de l'ensemble de la file d'attente pour certains d'autres conteneurs.
J'ai été réellement attend
static_cast
de travail.. comme priority_queue est l'adaptateur sur le conteneur (vecteur dans notre cas), mais il ne marche pas et j'ai dû utiliserreinterpret_cast
.