我有一个奇怪的问题,也许我遗漏了一些明显的东西,但我不能轻易地做到。

这是抛出断言的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);
}

发生的是先针对(5,34)测试了第一点(3,54),反之亦然。
此时,将抛出断言(无效的比较器)。但正如我看到的那样,它的权利是返回-1,因为3小于5,然后返回1,因为5大于3 ...

你能告诉我这是怎么回事吗?

最佳答案

抛出了无效的比较器assert,因为该函数返回-1和1,而std::sort仅接受true或false才能获得较弱的严格排序。

通过将功能更改为:

bool compareByX(const Vector2D &a, const Vector2D &b)
{
   return a.x < b.x;
}

一切都按预期进行。

最后,这确实是一个非常明显的错误。

09-28 06:56