2010-11-26 39 views
1

J'ai un problème avec la file d'attente prioritaire:C++, la file d'attente de priorité, les éléments ne sont pas triés

std::priority_queue <NodePrio, std::vector<NodePrio>, sortNodesByPrio> PQ; 

struct NodePrio 
{ 
Node *node; 
double priority; 

NodePrio() : node(NULL), priority(0) {} 
NodePrio(Node *node_, double priority_) : node(node_), priority(priority_) {} 
}; 

et

class sortNodesByPrio 
{ 
public: 
    bool operator() (const NodePrio &n1, const NodePrio &n2) const; 
} 


bool sortNodesByPrio::operator() (const NodePrio &n1, const NodePrio &n2) const 
{ 
return n1.priority < n2.priority; 
} 

Après avoir poussé à plusieurs reprises de nouveaux éléments

PQ.push(NodePrio(node, distance)); 

et de tout moment ils ne sont pas classés (voir ci-dessous) ... J'ai essayé de déboguer le code, le code comparateur a été à plusieurs reprises effectué ...

Step1: 
push (node, 55.33); 

PQ: 
[0] 55.33 

Step2: 
push (node, 105.91); 

PQ: 
[0] 105.91 
[1] 55.33 

Step 3: 
push (node, 45.18); 

PQ: 
[0] 105.91 
[1] 55.33 
[2] 45.18 

Step 4: 
push (node, 70.44); 

PQ: 
[0] 105.91 
[1] 70.44 
[2] 45.18 
[3] 55.33 //Bad sort 
+0

Qu'entendez-vous par "ils ne sont pas triés?" Pouvez-vous poster des exemples de données que vous entrez et le résultat lorsque vous sortez toutes les données de la file d'attente prioritaire? –

+0

Pouvez-vous donner un exemple ou deux de vos entrées et quel est le contenu de la file d'attente? Aussi, qu'avez-vous essayé de déboguer jusqu'à présent? – suszterpatt

Répondre

0

Essayez de changer

return n1.priority() < n2.priority(); 

à

return n1.priority < n2.priority; 
+1

question stupide: qu'est-ce que ajouter() à une variable faire? –

+0

@Markus: Cela en ferait un appel de fonction; il serait valide si 'priority' était d'un type quelconque qui pourrait être appelé comme une fonction ne prenant pas d'arguments, mais puisque c'est un' double', l'ajout de '()' à celui-ci rend le code mal formé. Je suppose que l'OP n'a pas copié et collé son code exact; il y a une autre erreur de syntaxe aussi. –

+0

@Rohit: Je suis désolé, c'était mon erreur en affichant le code .... Le code source original est correct. – Ian

7

sur la base des résultats de l'échantillon « » vous montrer, il semble que vous ne comprenez pas ce qu'est une file d'attente prioritaire est.

Une file d'attente prioritaire garantit que lorsque vous en supprimez des éléments (en utilisant top() et pop()), les éléments seront supprimés dans l'ordre de priorité. Les éléments ne sont pas stockés dans l'ordre de priorité, ils sont stockés dans un tas.

Vous pouvez consulter votre livre d'algorithmes préféré ou votre site Web pour plus d'informations sur la manière dont une file d'attente prioritaire stocke ses éléments.

+0

Merci pour votre explication, maintenant c'est clair. Je pensais que tous les éléments sont triés comme sur la carte, mais la duplication de clé est autorisée. – Ian

+0

Vous aurez besoin de 'std :: multimap' pour cela. – suszterpatt

+0

@suszterpatt. Je ne pense pas du tout. Je savais comment fonctionne le PQ, mais je me trompais totalement sur le stockage interne des objets. – Ian