127 votes

Comment créer Minstl priority_queue?

La file d'attente par défaut de priorité stl est une file d'attente maximale (la fonction Top renvoie l'élément le plus grand).

Disons, pour simplifier, que c'est une file d'attente prioritaire de valeurs int.

215voto

James McNellis Points 193607

Utilisez std::greater comme fonction de comparaison:

 std::priority_queue<int, std::vector<int>, std::greater<int> > my_min_heap;
 

52voto

AndyUK Points 1493

Une solution consisterait à définir un comparateur approprié avec lequel opérer sur la file d'attente à priorité ordinaire, de telle sorte que sa priorité soit inversée:

  #include <iostream>  
 #include <queue>  
 using namespace std;  

 struct compare  
 {  
   bool operator()(const int& l, const int& r)  
   {  
       return l > r;  
   }  
 };  

 int main()  
 {  
     priority_queue<int,vector<int>, compare > pq;  

     pq.push(3);  
     pq.push(5);  
     pq.push(1);  
     pq.push(8);  
     while ( !pq.empty() )  
     {  
         cout << pq.top() << endl;  
         pq.pop();  
     }  
     cin.get();  
 }
 

Ce qui donnerait 1, 3, 5, 8 respectivement.

Quelques exemples d'utilisation de files d'attente prioritaires via STL et les implémentations de Sedgewick sont donnés ici .

33voto

Peter Alexander Points 31990

Le troisième paramètre de modèle pour priority_queue est le comparateur. Configurez-le pour utiliser greater .

par exemple

 std::priority_queue<int, std::vector<int>, std::greater<int> > max_queue;
 

Vous aurez besoin de #include <functional> pour std::greater .

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