Il semble que je peux trier un std :: vecteur < std :: paire < int, std :: string > >, et il triera en fonction de la valeur int. Est-ce une chose bien définie à faire? Est-ce que std :: pair a un ordre par défaut basé sur ses éléments?Est-ce que std :: pair <int, std :: string> est bien défini?
Répondre
std::pair
utilise la comparaison lexicographique: Il sera basé sur le premier élément. Si les valeurs des premiers éléments sont égales, elles seront ensuite comparées en fonction du second élément.
La définition de la norme 03 C++ (section 20.2.2) est:
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).
L'opérateur de comparaison. Il utilise la comparaison lexicographique: la valeur de retour est vraie si le premier élément de x est inférieur au premier élément de y, et faux si le premier élément de y est inférieur au premier élément de x. Si ce n'est pas le cas, l'opérateur < renvoie le résultat de la comparaison des deuxièmes éléments de x et y. Cet opérateur ne peut être utilisé que si T1 et T2 sont LessThanComparable. Ceci est une fonction globale, pas une fonction membre.
On dirait que c'est en fait une combinaison des deux éléments.
Selon ma copie de la norme C++ 0x, section 20.3.3.26, std::pair
a un operator<
défini tel que pour deux paires x et y, il retourne
x.first < y.first || (!(y.first < x.first) && x.second < y.second)
Je ne suis pas certain si cela fait également partie de la norme de 2003. Je devrais également noter que ceci ne compilera pas si les éléments eux-mêmes ne sont pas LessThanComparable.
Oui. operator<()
est défini pour std::pair<T1, T2>
, en supposant que les deux T1
et T2
sont eux-mêmes comparables.