我有这种基本上是
的类型struct { int x,y,z; }
我想用作stl地图的关键字。由于它是自定义类型,我需要实现运算符<为地图做它比较魔术。
我很难找到允许这种功能的功能。到目前为止,我已经尝试过:
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值可能为负值,这会进一步使后续解决方案无效。
任何人都知道如何实现这样的功能?
答案 0 :(得分:9)
我假设您只需要任何稳定的订单,以便订购的容器能够正常工作。
if ( X != v.X ) return X < v.X;
if ( Y != v.Y ) return Y < v.Y;
return Z < v.Z;
这是做什么的:你订购基于X,除非X是相等的,如果是,你在Y上订购等等。
答案 1 :(得分: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<
将比产生<的运算符的存在更不令人惊讶em>随机结果。
答案 2 :(得分:0)
可以使用载体的长度
来比较三维向量SquareRoot(X*X + Y*Y + Z*Z);
这允许负方向。