C++ 无效比较器

dei*_*ght 4 c++ sorting vector

我有一个奇怪的问题,也许我遗漏了一些明显的东西,但我无法弄清楚。

这是引发断言的 C++ 代码:

int compareByX(const Vector2D &a, const Vector2D &b)
{
    if (a.x < b.x) // if i put a.x > b.x nothing changes
        return -1;
    return 1;
}
int main(int argc, char *argv[])
{
    double pts[6] = { 5, 34, 3, 54, 10, 34 };
    std::vector<Vector2D> points;
    for (int i = 0; i < 6; i += 2)
        points.push_back({ pts[i],pts[i + 1] });
    std::sort(points.begin(), points.end(), compareByX);
}
Run Code Online (Sandbox Code Playgroud)

发生的情况是第一点 (3, 54) 针对 (5, 34) 进行测试,然后反之亦然。此时会抛出断言(无效的比较器)。但正如我所见,返回 -1 是正确的,因为 3 小于 5,然后返回 1,因为 5 大于 3 ......

你能告诉我这有什么问题吗?

dei*_*ght 5

无效的比较器断言被抛出,因为该函数返回 -1 和 1,而 std::sort 仅采用 true 或 false 以具有弱严格排序。

通过将函数更改为:

bool compareByX(const Vector2D &a, const Vector2D &b)
{
   return a.x < b.x;
}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作。

最后确实是一个很明显的错误。

  • 严格来说你的答案是错误的。比较器只需要返回可以隐式转换为 `bool` 的东西,因此返回 `int` 就可以了。真正的问题是你的比较器同时产生了 `compareByX(a,b) == true` 和 `compareByX(b,a) == true`,这意味着没有严格的排序。请参阅 [此处](http://ideone.com/SrXVGP) 以获取一个工作示例,其中比较器返回一个 `int` 但完全没问题 (5认同)