2013-05-18 20 views
5

I class Passanger haben, die Variablen string name; string station; string ticket; hat und dann habe ich eine andere Klasse und innerhalb dieser Klasse Ich habe vector<Passanger*> myQueue;Mit stable_sort, wenn Vektor von Objekten Sortierung

jetzt will ich stable_sort verwenden myQueue zu sortieren. Gibt es irgendeine Möglichkeit, wie man zu stable_sort sagt, was sollte der Schlüssel sein, nach ihm soll myQueue sortieren?

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

Antwort

7

Ja, Sie brauchen eine Komparator-Klasse. Sie sehen so aus.

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

dann eine Instantiierung es als Parameter zu übergeben stable_sort.

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

Eine Funktion funktioniert in diesem Fall anstelle des Funktionsobjekts auf die gleiche Weise. –

1

Sie können dies tun, indem Sie Ihre eigene Vergleichsfunktion angeben.

Einige nützliche Referenzen:

10

Es ist eine Überlastung der std::stable_sort(), die einen Komparator individuelle akzeptiert als sein drittes Argument. Sie könnten dort eine Vergleichsfunktion, einen Funktor oder ein Lambda (in C++ 11) bereitstellen. Gehen mit einem Lambda, zum Beispiel:

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

einen Komparator definiert lambda beispiel (mit std::tie wenn die Art abhängig ist auf mehr als ein Attribut Passanger) unter Verwendung von:

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

Wenn C++ den Komparator 11 nicht verfügbar definieren, ist an anderer Stelle und verwenden Sie boost::tie.

Verwandte Themen