tuple second pairs ejemplo c++ stl sorting order

c++ - second - ¿El orden std:: pair<int, std:: string> está bien definido?



vector c++ (4)

Parece que puedo ordenar un std :: vector <std :: pair <int, std :: string >>, y se ordenará en función del valor int. ¿Es esto una cosa bien definida para hacer? ¿Std :: pair tiene un orden predeterminado basado en sus elementos?


De acuerdo con mi copia del estándar C ++ 0x, sección 20.3.3.26, std::pair tiene un operator< definido tal que para dos pares xey devuelve

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

No estoy seguro si esto también forma parte del estándar 2003. También debería tener en cuenta que esto no se compilará si los elementos en sí mismos no son LessThanComparable.


Sí. operator<() se define para std::pair<T1, T2> , suponiendo que tanto T1 como T2 son comparables.


Documentación de SGI

El operador de comparación. Utiliza la comparación lexicográfica: el valor de retorno es verdadero si el primer elemento de x es menor que el primer elemento de y, y falso si el primer elemento de y es menor que el primer elemento de x. Si ninguno de estos es el caso, entonces el operador <devuelve el resultado de comparar los segundos elementos de x y y. Este operador solo se puede usar si tanto T1 como T2 son LessThanComparable. Esta es una función global, no una función miembro.

Parece que en realidad es una combinación de ambos elementos.


std::pair usa comparación lexicográfica: se comparará en base al primer elemento. Si los valores de los primeros elementos son iguales, entonces se comparará en función del segundo elemento.

La definición en el estándar C ++ 03 (sección 20.2.2) es:

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).