2009-09-26 5 views
3

i est d'avoir une file d'attente prioritaire avec déclarationélément de suppression de la file d'attente prioritaire dans C++ stl

priority_queue<<Node>,vector<Node>,myComp> openQ 

je suis d'insérer des objets de nœud en elle. mais à un moment je dois supprimer l'élément de celui-ci. (pour ne pas enlever l'élément du haut)

Actuellement, pour le supprimer, j'élève l'élément et le place dans le tableau. si l'élément le plus haut est désiré, alors attendez que je pousse d'autres éléments dans le tableau.

Cela ressemble à une recherche linéaire et à une suppression. Je sais que ce n'est pas efficace et je suis à la recherche de meilleures façons

+0

Sur quel problème travaillez-vous? – GManNickG

+0

wow, ce poste est terriblement déroutant ... qu'est-ce que vous essayez de faire? – dharga

+0

Je dois trier l'objet nœud sur la base de ses clés, si le nœud est visité puis le supprimer pour optimiser – harshit

Répondre

5

priority_queue classe est conçu pour utiliser comme file d'attente avec des priorités. Et il a conçu pour enlever des éléments avec la fonction pop. Si vous voulez obtenir un comportement différent, vous devez utiliser une classe différente. Par exemple, std::map.

+3

C'est en fait décevant, donc ses utilisations sont limitées alors. J'ai besoin de la même chose que mentionné dans la question, mais il me faut rouler le mien. Dans mon cas, j'ai une PriorityQueue de ce que j'appelle ConnectionProcessors, ce qui permet à mon serveur de faire l'équilibrage de charge entre les threads (chaque thread de ConnectionProcessor est exécuté); comme les clients peuvent abandonner une connexion, le PriorityQueue doit être réorganisé, donc je dois supprimer le ConnectionProcessor et le rajouter. Et le processeur de connexion peut être n'importe où dans la file d'attente de priorité, donc le fait que je ne peux pas l'enlever, me semble stupide. – leetNightshade

1

std :: set sont orderd et peuvent effacer des éléments par valeur. l'infrastructure de données sous-jacente est un arbre de recherche binaire, c'est pourquoi il est moins cher d'effacer les éléments par valeur. Une file d'attente prioritaire devrait chercher linéairement dans la file d'attente, donc c'est possible mais pas très efficace, c'est pourquoi ils ne l'ont pas inclus.

Questions connexes