2013-03-24 18 views
5

Come utilizzare STL priority_queue per struct? Qualsiasi illustrazione di spingere & popping, dove struct ha più tipi di dati?
dire: struct thing { int a; char b;} glass[10];.
Ora come posso mettere questa struttura su priority_queue usando 'int a' per l'ordine?stl priority_queue di C++ con struct

risposta

12

Ecco una risposta leggermente modificata a your original question, which you deleted senza alcun motivo apparente. L'originale conteneva informazioni sufficienti per poterlo capire, ma ecco qui: fornire un confronto inferiore a quello che utilizza lo int per il confronto.

Tutto ciò che dovete fare è fornire un funtore che implementa un confronto inferiore a un rigoroso ordine debole, o un operatore di minore rispetto per la vostra classe che implementa lo stesso. Questo struct soddisfa i requisiti:

struct thing 
{ 
    int a; 
    char b; 
    bool operator<(const thing& rhs) const 
    { 
     return a < rhs.a; 
    } 
}; 

poi

std::priority_queue<thing> q; 
thing stuff = {42, 'x'}; 
q.push(stuff); 
q.push(thing{4242, 'y'}); // C++11 only 
q.emplace(424242, 'z'); // C++11 only  
thing otherStuff = q.top(); 
q.pop(); 
+0

Grazie^_^ e solo 1 ultima cosa: come spingerò dire (3, a) alla coda direttamente? Non so come mettere (3, a) in 'cose roba = ** ... **'. –

+0

In C++ 11, si può dire 'q.push (cosa {42, 'x'})' o 'q.emplace (42, 'x')'. Se non hai il supporto per C++ 11, devi dare a 'thing' un costruttore. – juanchopanza

4

sovraccarico < dell'operatore per thing:

struct thing 
{ 
    int a; 
    char b; 

    bool operator<(const thing &o) const 
    { 
     return a < o.a; 
    } 
}; 

priority_queue<thing> pq; 

thing t1, t2, t3; 

// ... 

pq.push(t1); 
pq.push(t2); 

// ... 

t3 = pq.top(); 
pq.pop(); 
2

È necessario implementare una funzione di confronto o sovraccarico operatore per dire coda di priorità che in quale ordine si desidera ordinare i dati personalizzati. Quando la coda prioritaria ordinerà i tuoi dati, allora avrà bisogno di un modo per sapere come confrontare tra loro. È necessario specificarlo passando una funzione alla coda di priorità o all'operatore di overload nella classe o struttura di dati personalizzata.

È possibile controllare la risposta this. This potrebbe aiutarti. Ho cercato di spiegare più modi di utilizzare la coda di priorità per i tipi di dati personalizzati.