example - map c++ pair
C++ std:: función de comparación de clasificación de clave de mapa? (2)
Debería publicar su código que implementa la sobrecarga de los operadores de comparación, por lo tanto, la respuesta se basa en adivinar:
Tu problema podría ser un simple error tipográfico (lo hice una vez)
bool operator < ( T lhs, T rhs ) const
{
return rhs < lhs; // note: lhs is on the right!
}
pero en realidad quieres:
bool operator < ( T lhs, T rhs ) const
{
return lhs < rhs;
}
Tengo una clase donde sobrecargo a todos los operadores de comparación. Cargué muchos de estos objetos en un mapa como claves y espero que el mapa los clasifique de menos a mayor.
Sin embargo, el mapa en realidad está ordenado por mayor a menor. ¿Por qué es esto? ¿No usa los operadores de comparación en la tecla cuando ordena el mapa? ¿Cómo puedo hacer que haga esto?
Si observa la definición de std :: map, el 3er parámetro es el comparador - std::less< Key >
de forma predeterminada. La implementación predeterminada es invocar al operator<
.
Podría intentar definir una nueva versión en el encabezado donde YourType
está definido, así:
template<> std::less< YourType >
{
bool operator()(
const YourType& lhs,
const YourType& rhs)
{
if(!(lhs.member1 < rhs.member1))
{
return false;
}
if(!(lhs.member2 < rhs.member2))
{
return false;
}
return true;
}
}
Recuerde a friend std::less< YourType >
en su clase.
La prueba real debe cumplir con lo siguiente o obtendrá todo tipo de problemas:
- lhs <rhs = true
- rha <lhs = falso
- lhs <lhs = falso
Una cosa importante a tener en cuenta (que descubrí hace poco) es que si tu compilador comienza a quejarse de que has redefinido el significado de std::less
u otras cosas funky, es posible que solo hayas declarado tu YourType
cuando declaró su std::map< YourType >
.
¡Espero que esto ayude!