2013-05-12 21 views
5

Mam problem z sortowaniem listy niestandardowych wskaźników klas. Klasa, którą muszę posortować, to zdarzenia. Otrzymują one losowy czas i muszę je wykonać we właściwej kolejności.C++ Sortowanie niestandardowych obiektów na liście

#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; 

......... 

Jeśli mógłbyś mi pomóc rozwiązać ten problem, byłbym bardzo wdzięczny! Utknąłem na tym od wielu godzin.

Dzięki!

Odpowiedz

1

Powinieneś to zrobić pod numerem std::sort. Możesz utworzyć niestandardową funkcję komparatora, która zostanie przekazana jako trzeci argument funkcji std::sort, lub możesz spowodować przeciążenie operatora < dla swojej klasy, a std::sort będzie działać naturalnie.

+6

Masz na myśli 'std :: list <> :: sort'. Nie można użyć 'std :: sort' na' std :: list', ponieważ nie ma on iteratorów z dostępem swobodnym. –

+0

Próbowałem użyć niestandardowej funkcji komparatora, ale nie będzie dla mnie. (I używanie list.sort) j – user2374868

+2

Również przeciążanie 'operatora <' nie pomoże w sortowaniu wskaźników. –

10

Ponieważ lista zawiera wskaźniki, a nie obiekty, musisz podać niestandardowy komparator, aby porównać obiekty, na które wskazują. A ponieważ używasz list, musisz użyć własnej metody sort: ogólny algorytm std::sort działa tylko w sekwencjach dostępu losowego.

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

lub, jeśli utkniesz w przeszłości i nie może korzystać lambdy:

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

EventList.sort(CompareEventTime()); 

Jeśli lista zawierała obiekty (jak to prawdopodobnie powinien), to może mieć sens, aby zapewnić zamiast tego operator porównania:

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

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

Dziękuję bardzo! Ostatni komentarz uświadomił mi, że używam wskaźników bez żadnego powodu. W związku z tym zmieniłem go i zaimplementowałem Twoje ostatnie rozwiązanie, które działa teraz idealnie. (btw. Ostatnie rozwiązanie spowodowało błąd polegający na tym, że wymagałem tylko jednego elementu w funkcji operatora, więc usunąłem lhs i użyłem tego-> zamiast tego – user2374868

+0

@ user2374868: Tak, można uczynić operatora funkcją członka z pojedynczym Argument, a nie mój przykład osoby niezrzeszonej z dwoma argumentami. –

+0

W przypadku list użyj List.Sort(), a nie std :: Sort() Po prostu zdałem sobie sprawę z tego po godzinie –

Powiązane problemy