relacionados: what can I use as std::map
keys?El uso de un vector (matemática) en un std :: mapa
que necesitaba para crear una asignación en lugares clave específicas en el mapa espacio a las listas de objetos. std::map
parecía la manera de hacerlo.
Así que estoy tecleando un std::map
en una xyz Vector
class Vector
{
float x,y,z
} ;
, y estoy haciendo un std::map<Vector, std::vector<Object*> >
. Así que tenga en cuenta que la clave aquí no es a std::vector
, es un objeto de class Vector
que es solo un vector math xyz de mi propia creación.
para producir una "orden estrictamente débil" He escrito el siguiente sobrecarga para operator<
:
bool Vector::operator<(const Vector & b) const {
// z trumps, then y, then x
if(z < b.z)
{
return true ;
}
else if(z == b.z)
{
if(y < b.y)
{
// z == b.z and y < b.y
return true ;
}
else if(y == b.y)
{
if(x < b.x)
{
return true ;
}
else if(x == b.x)
{
// completely equal
return false ;
}
else
{
return false ;
}
}
else
{
// z==b.z and y >= b.y
return false ;
}
}
else
{
// z >= b.z
return false ;
}
}
Es un poco largo, pero básicamente lo hace tan consistentemente cualquier vector puede decirse que es menos que cualquier otro vector ((-1, -1, -1) < (-1, -1,1) y (-1, -1, 1)> (-1, -1, -1) por ejemplo).
Mi problema es que esto es realmente artificial y aunque lo he codificado y funciona, estoy descubriendo que "contamina" mi clase Vector (matemáticamente) con esta noción realmente extraña, artificial y no matemática de "menos que" para un vector.
Pero necesito crear una asignación donde las ubicaciones de teclas específicas en el espacio se asignan a ciertos objetos, y std :: map parece la manera de hacerlo.
Sugerencias? ¡Soluciones listas para usar!
Si está utilizando flotadores quizás desee evitar esto z == b.z. Pruebe algo así como abs (z-b.z)
InsertNickHere
Esto no tiene nada que ver con su pregunta específica (así que lo publicaré como comentario), pero ya que pidió sugerencias ... El uso de '==' para comparar valores de punto flotante podría ser un problema. Si dos valores solo difieren en los errores de redondeo, ¿realmente desea que se los trate como ubicaciones diferentes? Es posible que desee tratar los componentes dentro de 'epsilon' uno del otro como iguales, para el propósito de su operador de comparación. –
@InsertNick: ¡Las grandes mentes piensan igual! (Sin embargo, los tontos rara vez difieren ...) –