C++ 实施运营商<;对于x,y,z坐标

C++ 实施运营商<;对于x,y,z坐标,c++,stl,C++,Stl,我有这种类型,基本上是一种 struct { int x,y,z; } 我想用作stl映射的键。因为它是一个自定义类型,所以我需要实现操作符

我有这种类型,基本上是一种

struct { int x,y,z; } 
我想用作stl映射的键。因为它是一个自定义类型,所以我需要实现操作符<,以便映射执行比较魔术

我很难实现这个功能。到目前为止,我已经尝试:

return X < v.X && Y < v.Y && Z < v.Z;
返回X
这根本不起作用,而且

return X*X+Y*Y+Z*Z < v.X*v.X+v.Y*v.Y+v.Z*v.Z;
返回X*X+Y*Y+Z*Z
它给出了这个形状而不是正方形:

请记住,x、y或z值可能为负值,这会进一步使后面的解决方案无效


有人知道如何实现这样的功能吗

我假设您只需要任何稳定的订单,这样一个有序的容器就可以工作了

if ( X != v.X ) return X < v.X;
if ( Y != v.Y ) return Y < v.Y;
return Z < v.Z; 
如果(X!=v.X)返回X

这样做的目的:除非X相等,否则您可以基于X进行排序,如果是这样,您可以基于Y进行排序,等等。

可以使用向量的长度来比较三维向量

SquareRoot(X*X + Y*Y + Z*Z);

这允许负方向。

您不需要操作员。这取决于您想要使用的顺序。。。你认为(0,-1,+1)比(1,0,-1)大吗?比较两个三维点的方法有很多种,您需要指定要使用的方法…返回X?对于您的结构,“小于”意味着什么?订购在这里很重要。如果您只需要生成一个键,那么您基本上需要某种哈希函数,以便x、y和z在比较器中使用。@Gabe,您不能这样做。运算符不能含糊不清。@Joe:在这种情况下,“小于”的含义是不相关的,因为OP只是试图定义一个总排序。散列的问题是,他可能会得到散列冲突,然后他就回到了他开始的地方。但是如果X是负数,它将是相同的值-2*-2==2*2对它们进行立方体和立方根运算,然后返回l.x未实现严格的弱排序;i、 例如,如果实际与
std::map
一起使用,此代码将调用UB。
struct compareXYZ : std::binary_function<Point,Point,bool> {
   bool operator()( Point const & l, Point const & r ) const {
      return l.x < r.x 
          || (l.x == r.x) && (l.y < r.y)
          || (l.x == r.x) && (l.y == r.y) && l.z < r.z;
   }
};
std::map< Point, Value, compareXYZ> theMap;     // uses XYZ comparison