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

时间:2015-12-02 16:24:06

标签: c++ c++11 std stdset

我需要一个非重复的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<MyPoint2D, decltype(compMyPoint2D)> 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;
}

我需要在插入std::set之前预先订购2d点,或者对于2d点有更好的比较功能吗?

插入所有点后我需要使用std::find来获得最终的点索引。

我在Microsoft Visual Studio 2010上使用本机C ++。

2 个答案:

答案 0 :(得分:5)

您的比较功能有误。取出+容差。在尝试确定浮点值中的绝对顺序时,这没有用。例如,它并没有强制实现等价的传递性。也就是说,如果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; 时就不一定公差调整在那里。

这样做:

int main()
{
    char str[100];
    int i;
    printf("Enter string:");
    fgets(str,sizeof(str),stdin);

    for (i = 0; i <= strlen(str); i++)
    {
        if (str[i] == ' ')
        {
            // Here the space and how should I switch words now?
        }
    }

    return 0;
}

答案 1 :(得分:2)

首先,除非你有理由不这样做,否则最好只为你的班级定义operator<,这意味着在使用std::set等时输入更少,这意味着你可以使用中缀{{1} }。其次,正如本杰明所指出的,不应该<。第三,您可以简化比较的逻辑。

你应该有类似的东西:

tolerance

然后你可以使用bool operator<(const MyPoint2D& lhs, const MyPoint2D& rhs) { return lhs._x < rhs._x || (lhs._x == rhs._x && lhs._y < rhs._y); }