2013-05-12 15 views
5

Sto riscontrando problemi nell'ordinare un elenco di puntatori di classe personalizzati. La classe che ho bisogno di ordinare sono gli eventi. Questi vengono assegnati a un tempo casuale e ho bisogno di farli nel giusto ordine.C++ Ordinamento di oggetti personalizzati in un elenco

#include <list> 

Class Event{ 
public: 
float time; // the value which I need to sort them by 
int type; // to indicate which event i'm dealing with 

Event(float tempTime, int tempType) 
{ 
    time = tempTime; 
    type = tempType; 
} 


int main(){ 

std::list<Event*> EventList; 
list<Event*>::iterator it; 

......... 

Se potessi aiutarmi a risolvere questo, sarebbe molto apprezzato! Sono stato bloccato su questo per ore ora.

Grazie!

risposta

1

Si dovrebbe fare ciò con std::sort. Puoi eseguire una funzione di confronto personalizzata che passi come terzo argomento alla funzione std::sort, oppure puoi creare un sovraccarico dell'operatore < per la tua classe e std::sort funzionerà naturalmente.

+6

Intendi 'std :: list <> :: sort'. Non puoi usare 'std :: sort' su' std :: list', perché non ha iteratori ad accesso casuale. –

+0

Ho provato a utilizzare una funzione di confronto personalizzata ma non funzionerà per me. (E usando list.sort) j – user2374868

+2

Inoltre, sovraccaricare l'operatore '' <'non aiuterà a ordinare i puntatori. –

10

Poiché l'elenco contiene puntatori, anziché oggetti, è necessario fornire un comparatore personalizzato per confrontare gli oggetti a cui puntano. E dal momento che stai utilizzando uno list, devi utilizzare il proprio metodo sort: l'algoritmo generico std::sort funziona solo su sequenze ad accesso casuale.

EventList.sort([](Event * lhs, Event * rhs) {return lhs->time < rhs->time;}); 

o, se sei bloccato in passato e non è possibile utilizzare lambda:

struct CompareEventTime { 
    bool operator()(Event * lhs, Event * rhs) {return lhs->time < rhs->time;} 
}; 

EventList.sort(CompareEventTime()); 

Se la lista conteneva oggetti (come probabilmente dovrebbe), allora potrebbe avere senso per fornire invece un operatore di confronto:

bool operator<(Event const & lhs, Event const & rhs) {return lhs.time < rhs.time;} 

std::list<Event> EventList; 
//... 
EventList.sort(); 
+0

Grazie mille! L'ultimo commento mi ha fatto capire che stavo usando i puntatori senza alcun motivo. Così l'ho cambiato e ho implementato la tua ultima soluzione e ora funziona perfettamente. (btw. L'ultima soluzione mi ha dato un errore di richiedere solo un singolo elemento nella funzione operatore, quindi ho cancellato il lhs e usato questo-> invece – user2374868

+0

@ user2374868: Sì, si potrebbe rendere all'operatore una funzione membro con un singolo argomento, piuttosto che il mio esempio di un non membro con due argomenti: –

+0

Per gli elenchi, utilizzare List.Sort() e non std :: Sort() Ho appena realizzato questo dopo un'ora –

Problemi correlati