【发布时间】:2014-06-09 10:35:52
【问题描述】:
我要存储Point3D对象的std::set,我的比较函数定义如下(字典序):
bool operator<(const Point3D &Pt1, const Point3D &Pt2)
{
const double tol = 1e-5;
if(fabs(Pt1.x() - Pt2.x()) > tol)
{
return Pt1.x() < Pt2.x();
}
else if(fabs(Pt1.y() - Pt2.y()) > tol)
{
return Pt1.y() < Pt2.y();
}
else if(fabs(Pt1.z() - Pt2.z()) > tol)
{
return Pt1.z() < Pt2.z();
}
else
{
return false;
}
}
在某些情况下set 包含相同的点,我认为问题来自比较功能,但我没有找到确切的问题。任何帮助将不胜感激!
【问题讨论】:
-
你的比较运算符需要实现严格的弱排序:stackoverflow.com/questions/979759/…
-
那么问题来了:如何使用
double和容差实现严格的弱排序? -
那么您的代码目前仅单独测试每个 x,y,z 坐标,您需要测试是否所有坐标都小于 epsilon,然后返回 false
-
@EdChum 但如果所有三个差值都小于 epsilon,则运算符返回 false。
-
这些似乎是空间中的点。您是否考虑过使用欧几里得距离进行排序?容差会更容易实现。