4

我有这种类型,基本上是

struct { int x,y,z; } 

我想用作 stl 映射的键。由于它是一种自定义类型,因此我需要为地图实现 operator< 来进行比较魔术。

我很难使用允许这样做的功能。到目前为止,我已经尝试过:

return X < v.X && Y < v.Y && Z < v.Z;

这根本不起作用,并且

return X*X+Y*Y+Z*Z < v.X*v.X+v.Y*v.Y+v.Z*v.Z;

它给出了这种形状而不是正方形:

在此处输入图像描述

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

任何人都知道如何实现这样的功能?

4

3 回答 3

10

我假设您只想要任何稳定的订单,以便订购的容器可以工作。

if ( X != v.X ) return X < v.X;
if ( Y != v.Y ) return Y < v.Y;
return Z < v.Z; 

这是做什么的:除非 X 相等,否则您根据 X 订购,如果是,则您根据 Y 订购,等等。

于 2012-06-24T22:42:19.590 回答
7

不需要 operator<,也不应该在运算符的语义对于在同一域中工作的所有人都不是自然的情况下实现它,以避免混淆。其他人可能对less的含义有不同的解释,将两点与提供的内容进行比较operator<,然后对结果感到困惑。

您最好为您的特定地图提供比较运算符:

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

这样,对于地图的用户来说,点将如何在容器中排序(例如对于线性迭代)是很清楚的,并且缺少operator<产生随机结果的运算符并不令人惊讶。

于 2012-06-24T23:44:12.147 回答
1

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

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

这允许负方向。

于 2012-06-24T22:42:49.873 回答