我有这种类型,基本上是一个
struct { int x,y,z; }
Run Code Online (Sandbox Code Playgroud)
我想用作stl地图的关键字.由于它是一个自定义类型,我需要实现运算符<为地图做比较魔术.
我很难找到允许它的功能.到目前为止,我已经尝试过:
return X < v.X && Y < v.Y && Z < v.Z;
Run Code Online (Sandbox Code Playgroud)
这根本不起作用,而且
return X*X+Y*Y+Z*Z < v.X*v.X+v.Y*v.Y+v.Z*v.Z;
Run Code Online (Sandbox Code Playgroud)
给出这个形状而不是正方形:

请记住,x,y或z值可能为负值,这会进一步使后面的解决方案无效.
任何人都知道如何实现这样的功能?
我假设您只需要任何稳定的订单,这样订购的容器就可以运行.
if ( X != v.X ) return X < v.X;
if ( Y != v.Y ) return Y < v.Y;
return Z < v.Z;
Run Code Online (Sandbox Code Playgroud)
这是做什么的:除非X是相同的,否则你是根据X订购的,如果是,你在Y上订购等等.
您不需要 operator<,并且在运营商的语义对于在同一域中工作的所有人来说不自然以避免混淆的情况下,您不应该实现它.其他人可能对不太重要的东西有不同的解释,将两点与所提供的进行比较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
Run Code Online (Sandbox Code Playgroud)
这样,地图的用户很清楚如何在容器中对点进行排序(比如用于线性迭代),并且缺少operator<比产生随机结果的运算符的存在更不令人惊讶.