2009-10-05 9 views
4

J'utilise donc la file d'attente STL priority_queue <> avec des pointeurs ... Je ne veux pas utiliser de types de valeur, car créer un tas de nouveaux objets à utiliser dans la file d'attente prioritaire serait extrêmement coûteux. Alors ... Je suis en train de le faire:priority_queue <> comparaison pour les pointeurs?

class Int { 
public: 
    Int(int val) : m_val(val) {} 
    int getVal() { return m_val; } 
private: 
    int m_val; 
} 


priority_queue<Int*> myQ; 

myQ.push(new Int(5)); 
myQ.push(new Int(6)); 
myQ.push(new Int(3)); 

Maintenant, comment puis-je écrire une fonction de comparaison pour obtenir ceux à commander correctement dans le Q? Ou, quelqu'un peut-il suggérer une autre stratégie? J'ai vraiment besoin de l'interface priority_queue et je n'aimerais pas utiliser les constructeurs de copie (à cause des quantités massives de données). Merci

EDIT: Int est juste un espace réservé/par exemple ... Je sais que je peux utiliser int en C/C++ lol ...

Répondre

3

Une option qui va sûrement travailler est de remplacer Int* avec shared_ptr<Int> puis mettre en œuvre operator< pour shared_ptr<Int>

bool operator<(const shared_ptr<Int> a, const shared_ptr<Int> b) 
{ 
    return a->getVal() < b->getVal(); 
} 
+0

J'essaie cette approche en ce moment ... au lieu d'utiliser shared_ptr juste en utilisant une classe wrapper de base. – Polaris878

+0

J'ai accepté cela parce que je suis fondamentalement en utilisant la même idée ... – Polaris878

+0

@ Polaris878 Bien que les pointeurs partagés ne sont pas pertinents ici. Vous n'avez jamais dit que vous vouliez une propriété partagée. – juanchopanza

0

Un entier est la même taille que sur un pointeur 32 bits systèmes. Sur les systèmes 64 bits, un pointeur sera deux fois plus grand. Par conséquent, il est plus simple/plus rapide/préférable d'utiliser des entiers réguliers.

+0

Int est juste un espace réservé pour une classe beaucoup plus grande. – Polaris878

+0

dans ce cas, ignorez cette réponse. – thekidder

9

Vous pouvez spécifier quel comparateur votre file d'attente doit utiliser.

#include <iostream> 
#include <sstream> 
#include <functional> 
#include <vector> 
#include <queue> 

class Int { 
public: 
    Int(int val) : m_val(val) {} 
    int getVal() { return m_val; } 
    bool operator<(const Int &other) const { return m_val < other.m_val; } 
private: 
    int m_val; 
}; 

template<typename Type, typename Compare = std::less<Type> > 
struct pless : public std::binary_function<Type *, Type *, bool> { 
    bool operator()(const Type *x, const Type *y) const 
     { return Compare()(*x, *y); } 
}; 

int main(int argc, char *argv[]) { 
    std::priority_queue<Int*, std::vector<Int*>, pless<Int> > myQ; 

    for (int i = 1; i < argc; i++) { 
     std::stringstream ss(argv[i]); 
     int x; 
     ss >> x; 
     myQ.push(new Int(x)); 
    } 

    for (; !myQ.empty(); delete myQ.top(), myQ.pop()) 
     std::cout << myQ.top()->getVal() << std::endl; 

    return 0; 
} 
Questions connexes