2013-05-18 11 views
5

mam class Passanger który ma zmienne string name; string station; string ticket; a potem mam innej klasy iw tej klasie mam vector<Passanger*> myQueue;Korzystanie stable_sort, przy sortowaniu wektor obiektów

teraz chcę użyć do sortowania myQueuestable_sort. Czy jest jakakolwiek możliwość, jak powiedzieć stable_sort, jaki powinien być klucz, według niego będzie sortować myQueue?

std::stable_sort(myQueue.begin(),myQueue.end(), maybeSomethingElse());?

Odpowiedz

7

Tak, potrzebujesz klasy komparatora. Wyglądają tak.

class CompareFoo { 
    public: 
    bool operator() (const Foo* e1, const Foo* s2) 
    { 
     return e1->name < e2->name; // strict weak ordering required 
    } 
}; 

następnie przekazać instancji go jako parametr stable_sort.

std::stable_sort(myQueue.begin(), myQueue.end(), CompareFoo()); 
+1

Funkcja działa tak samo w tym przypadku w miejsce obiektu funkcji. –

10

występuje przeciążenie std::stable_sort() że przyjmuje zamówienie Komparator trzeci argument. Można tu wprowadzić funkcję porównania, funktor lub lambda (w C++ 11). Idąc z lambda, na przykład:

std::stable_sort(myQueue.begin(),myQueue.end(), [] (Passenger* p1, Passenger* p2) 
{ 
    return p1->age() < p2->age(); // Or whatever first your needs... 
}); 
3

zdefiniować komparator za pomocą lambda, na przykład (z std::tie jeśli rodzaj zależy od więcej niż jednego atrybutu Passanger):

std::stable_sort(myQueue.begin(), 
       myQueue.end(), 
       [](Passanger* p1, Passanger* p2) 
       { 
        return std::tie(p1->name(), p1->station()) < 
          std::tie(p2->name(), p2->station()); 
       }); 

C++ 11 Jeśli nie jest dostępny określenia komparator gdzie indziej i użyj boost::tie.

Powiązane problemy