我需要一个非重复的2D点列表,所以我使用了std::set
一个自定义比较函数.我使用的函数在插入点后有问题,因为有时候std::find
找不到已经插入的点.
const double tolerance = 0.1; struct MyPoint2D { MyPoint2D(double x, double y) : _x(x), _y(y) {} double _x, _y; }; auto compMyPoint2D = [&](const MyPoint2D& pointA, const MyPoint2D& pointB) -> bool { if (pointA._x < pointB._x - tolerance) return true; if (pointA._x > pointB._x + tolerance) return false; if (pointA._y < pointB._y - tolerance) return true; return false; }; std::setorderedMyPoints(compMyPoint2D); MyPoint2D pointA(0.66,1.14); MyPoint2D pointB(0.75, 0.0); MyPoint2D pointC(0.57,1.19); orderedMyPoints.insert(pointA); orderedMyPoints.insert(pointB); orderedMyPoints.insert(pointC); if (orderedMyPoints.find(pointC)==orderedMyPoints.end()) { std::cout << "Not found" << std::endl; orderedMyPoints.insert(pointC); if (orderedMyPoints.find(pointC)==orderedMyPoints.end()) std::cout << "Still not found" << std::endl; }
我是否需要在插入之前预先订购2d点,std::set
或者对于2d点有更好的比较功能?
我需要std::find
在插入所有点后使用以获得最终点索引.
我在Microsoft Visual Studio 2010上使用本机C++.
你的比较功能是错误的.取出+容差.在尝试确定浮点值之间的绝对顺序时,这没有用.例如,它不强制等效的传递性.也就是说,如果A == B
(即f(A, B)
,f(B, A)
并且都是假的)B == C
,那么A == C
当你在那里进行公差调整时不一定是这种情况.
这样做:
if (pointA._x < pointB._x) return true; if (pointA._x > pointB._x) return false; if (pointA._y < pointB._y) return true; return false;