La file d'attente de priorité stl par défaut est Max one (la fonction Top renvoie le plus grand élément).
Disons, pour simplifier, qu'il s'agit d'une file d'attente prioritaire de valeurs int.
c++
stl
priority-queue
amitlicht
la source
la source
operator>
, ce qui fonctionnerait à merveille avecstd::greater
. Vous pouvez également écrire votre propre foncteur au lieu destd::greater
si vous le souhaitez.operator<
;)vector
etdeque
remplissent les conditions qu'un conteneur sous-jacent doit remplir pour une priority_queue. Vous pouvez également utiliser une classe de conteneur personnalisée. Vous pouvez trouver une explication beaucoup plus élaborée sur cplusplus.com/reference/queue/priority_queueUne façon serait de définir un comparateur approprié avec lequel opérer sur la file d'attente de priorité ordinaire, de sorte que sa priorité soit inversée:
Ce qui produirait respectivement 1, 3, 5, 8.
Quelques exemples d'utilisation de files d'attente prioritaires via les implémentations de STL et de Sedgewick sont donnés ici .
la source
Le troisième paramètre de modèle pour
priority_queue
est le comparateur. Réglez-le pour l'utilisergreater
.par exemple
Vous aurez besoin
#include <functional>
destd::greater
.la source
Vous pouvez le faire de plusieurs manières:
1. En utilisant
greater
comme fonction de comparaison:2. Insérer des valeurs en modifiant leur signe (en utilisant moins (-) pour un nombre positif et en utilisant plus (+) pour un nombre négatif:
3. Utilisation d'une structure ou d'une classe personnalisée:
4. En utilisant une structure ou une classe personnalisée, vous pouvez utiliser priority_queue dans n'importe quel ordre. Supposons que nous voulions trier les personnes par ordre décroissant en fonction de leur salaire et si égalité, en fonction de leur âge.
Le même résultat peut être obtenu par surcharge de l'opérateur:
En fonction principale:
la source
bool operator > (const people & p)const
dans 5) surcharge de l'opérateur<
surchargé comme ça, il vaut mieux surcharger>
et utilisergreater<people>
En C ++ 11, vous pouvez également créer un alias pour plus de commodité:
Et utilisez-le comme ceci:
la source
Une façon de résoudre ce problème est de pousser le négatif de chaque élément dans priority_queue afin que le plus grand élément devienne le plus petit élément. Au moment de faire l'opération pop, prenez la négation de chaque élément.
la source
Sur la base de toutes les réponses, j'ai créé un exemple de code pour savoir comment créer une file d'attente prioritaire. Remarque: cela fonctionne avec les compilateurs C ++ 11 et supérieurs
Sortie du code ci-dessus
la source
Nous pouvons le faire de plusieurs manières.
Utilisation du paramètre de comparateur de modèle
Utilisation de la classe de compartiment définie utilisée
la source