Parece que puedo ordenar un std :: vector < std :: pair < int, std :: string > >, y se ordenará según el valor int. ¿Es esto una cosa bien definida para hacer? ¿Std :: pair tiene un orden predeterminado basado en sus elementos?¿El ordenamiento std :: pair <int, std :: string> está bien definido?
Respuesta
std::pair
utiliza la comparación lexicográfica: se comparará en función del primer elemento. Si los valores de los primeros elementos son iguales, entonces se comparará en función del segundo elemento.
La definición en la norma 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).
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, el operador < devuelve el resultado de comparar los segundos elementos de xey. 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.
Según mi copia del estándar C++ 0x, sección 20.3.3.26, std::pair
tiene un operator<
definido de tal manera que para dos pares x e y, devuelve
x.first < y.first || (!(y.first < x.first) && x.second < y.second)
No estoy seguro de si esto es parte del estándar 2003 también. 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 ambos T1
y T2
son comparables.
- 1. Ordenar un std :: vector <std :: pair <std :: string, bool >> por la cadena?
- 2. C++ std :: pair, std :: vector y memcopy
- 3. std :: pair <int, int> vs struct con dos int
- 4. ¿Qué es std :: pair?
- 5. ¿Este código está bien definido?
- 6. ¿Por qué std :: sub_match <T> hereda públicamente de std :: pair <T, T>?
- 7. ¿Cómo inicializo un const std :: pair?
- 8. struct con 2 celdas vs std :: pair?
- 9. ¿Hay alguna diferencia entre std :: map <int, int> y std :: map <const int, int>?
- 10. Cómo insertar un par de std :: pair dentro de otro std :: pair?
- 11. ¿Está bien lanzar manualmente un std :: bad_alloc?
- 12. Cómo convertir un std :: list ordenado de std :: pair a un std :: map
- 13. ¿Cuál es el propósito de std :: make_pair frente al constructor de std :: pair?
- 14. std :: vector <std::string> crash
- 15. ¿Está std :: list <> :: sort stable?
- 16. BOOST_CHECK_EQUAL con el par <int, int> y el operador personalizado <<
- 17. ¿Qué es el análogo de C# de C++ std :: pair?
- 18. find_if y std :: pair, pero sólo un elemento
- 19. ¿Por qué el complejo <double> * int no está definido en C++?
- 20. Problema con std :: mapa y std :: par
- 21. convertir int a std :: string
- 22. ordenamiento dependiente de la configuración regional para std :: string
- 23. Encadenamiento de predicados de ordenamiento (por ejemplo, para std :: sort)
- 24. ¿Este código está bien definido?
- 25. ¿Está bien usar iostreams con int como character-type?
- 26. std :: streampos, std :: streamoff y std :: streamsize a long long int?
- 27. ¿Cómo puedo encontrar el int más grande en un std :: set <int>?
- 28. Clang, std :: shared_ptr y std :: menos/operador <
- 29. Convierte std :: string en std :: vector <char>
- 30. const std :: map <boost :: tuples :: tuple, std :: string>?