当前位置:  开发笔记 > 编程语言 > 正文

std ::为2D点设置自定义比较器

如何解决《std::为2D点设置自定义比较器》经验,为你挑选了1个好方法。

我需要一个非重复的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::set orderedMyPoints(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++.



1> Benjamin Lin..:

你的比较功能是错误的.取出+容差.在尝试确定浮点值之间的绝对顺序时,这没有用.例如,它不强制等效的传递性.也就是说,如果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;

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有