2010-05-12 5 views
28

Es scheint, dass ich ein std :: vector < std :: pair < int, std :: string > > sortieren kann, und es wird basierend auf dem int-Wert sortieren. Ist das eine gut definierte Sache? Hat std :: pair eine Standardreihenfolge basierend auf seinen Elementen?Ist std :: pair <int, std :: string> wohldefiniert?

Antwort

44

std::pair verwendet lexikographischen Vergleich: Es wird basierend auf dem ersten Element zu vergleichen. Wenn die Werte der ersten Elemente gleich sind, wird es basierend auf dem zweiten Element verglichen.

der Definition im Standard 03 ++ C (Abschnitt 20.2.2) ist:

template <class T1, class T2> 
bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y); 

Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second). 
1

Documentation from SGI

Der Vergleichsoperator. Es verwendet einen lexikographischen Vergleich: Der Rückgabewert ist wahr, wenn das erste Element von x kleiner ist als das erste Element von y, und falsch, wenn das erste Element von y kleiner ist als das erste Element von x. Wenn keiner von beiden der Fall ist, gibt der Operator < das Ergebnis des Vergleichs der zweiten Elemente von x und y zurück. Dieser Operator darf nur verwendet werden, wenn sowohl T1 als auch T2 LessThanComparable sind. Dies ist eine globale Funktion, keine Elementfunktion.

Sieht aus wie es ist eigentlich eine Kombination aus beiden Elementen.

6

Nach meiner Kopie des C++ 0x-Standard, Abschnitt 20.3.3.26 hat std::pair ein operator< so definiert, dass für zwei Paare x und y, es gibt

x.first < y.first || (!(y.first < x.first) && x.second < y.second) 

Ich bin nicht sicher, ob Dies ist Teil des Standards von 2003. Ich sollte auch beachten, dass dies nicht kompiliert wird, wenn die Elemente selbst nicht LessThanComparable sind.

0

Ja. operator<() ist für std::pair<T1, T2> definiert, unter der Annahme, dass sowohl T1 als auch T2 selbst vergleichbar sind.

Verwandte Themen