transfert entre priority_queue

transfert entre priority_queue - C++ - Programmation

Marsh Posté le 03-02-2004 à 09:44:30    

J'ai deux priority_queue qui contiennent des instances de la structure :
 

Code :
  1. struct valued_pixel
  2. {
  3.     size_t x;
  4.     size_t y;
  5.     float  harris_value;
  6. };


 
J'utilmise un operateur de comapraison < qui tri ces structure selon leur valeur de harris_value.
 
Au final j'obtiens en fin de ma fonction une priority_queue remplie de valued_pixel triée par harris_value décroissante.
 
la ca se corse ^^
 
maintenant, je veut récupérer les N premiers éléments de cette priority_queue et les rangé dans une autre priority_queue où ils seront classé par y pui x croissants.
 
Actuellement je fait un boucle style :
 

Code :
  1. PIXELLIST_1 initial_queue;
  2. PIXELLIST_2 final_queue;
  3. valued_pixel p;
  4. while( !initial_queue.empty() )
  5. {
  6.     p = initial_queue.top();
  7.     final_queue.push(p);
  8.     initial_queue.pop();
  9. }


 
Les PIXELLIST_1 et PIXELLIST_2 sont des typedefs sur l'instantiation du template priority_queue.
 
c'est moche ... y aurait pas un moyen moins moche qui minimiserais ce genre de gymnastique. je me rappelle vagueent d'une astuce dans laquelle on pouvait changer l'operator< utilisé par la queue ....
 
Ou alors ai-je fumé ^^


Message édité par Joel F le 03-02-2004 à 10:36:47
Reply

Marsh Posté le 03-02-2004 à 09:44:30   

Reply

Marsh Posté le 03-02-2004 à 10:19:48    

ben si tu as tant besoin que ça d'itérateur, maintient un vecteur ordonné
 
it = initial_queue.begin();  ça existe pas ça ?
 
 

Citation :

on pouvait changer l'operator< utilisé par la queue ....

non, c'est parti intégrante du type de toutes façons


Message édité par Taz le 03-02-2004 à 10:21:45
Reply

Marsh Posté le 03-02-2004 à 10:36:30    

taz a écrit :

ben si tu as tant besoin que ça d'itérateur, maintient un vecteur ordonné


 
o_O ?? Donc y a pas moyen d'eviter ce parcours avec recopie ?
 
Attends, j'ai corrigé le code + haut ^^


Message édité par Joel F le 03-02-2004 à 10:37:04
Reply

Marsh Posté le 03-02-2004 à 10:40:05    

ben non. ce que tu as qu'à faire, c'est reprendre le code trivial de priority_queue et ajouter ce qu'il te faut. ou bosser directement sur un vecteur sans interface ....

Reply

Marsh Posté le 03-02-2004 à 10:41:30    

valued_pixel p;
p = initial_queue.top();  
final_queue.push(p);  
 
=>
 
valued_pixel &p(initial_queue.top());  
final_queue.push(p);  
 
peut-être pour éviter une copie ?
 
(je parie que je suis complètement a coté :p)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-02-2004 à 10:44:28    

ouais ouais, avec un const c'est encore mieux, mais bon, là n'est pas le gain recherché

Reply

Marsh Posté le 03-02-2004 à 11:04:34    

taz a écrit :

ben non. ce que tu as qu'à faire, c'est reprendre le code trivial de priority_queue et ajouter ce qu'il te faut. ou bosser directement sur un vecteur sans interface ....


 
un vector ou je gere moi même l'insertion quoi :-/

Reply

Marsh Posté le 03-02-2004 à 11:08:13    

bah tu peux faire un héritage public (pas de polymorphisme car ~ pas virtuel), et rajouter make_heap, push_heap, pop_heap, is_heap

Reply

Marsh Posté le 03-02-2004 à 11:27:26    

Ok je vais me faire ma multipriority_queue quoi ^^

Reply

Marsh Posté le 03-02-2004 à 11:39:15    

ouaip, cai supair facile

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed