C++ 无效比较器

标签 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);
}

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

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

最佳答案

无效的比较器断言被抛出是因为函数返回 -1 和 1,而 std::sort 只接受 true 或 false 以实现弱严格排序。

通过将函数更改为:

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

一切都按预期进行。

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

关于C++ 无效比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44278059/

相关文章:

c++ - 将真值表加载到二维 vector 中

c++ - Eclipse CDT + ICC 编译器

c++ - 访问现有基础对象的 protected 成员

c++ - Qt QByteArray 无符号数据类型

javascript - dhtmlxGrid 如何选取值进行排序?

php - MySQL/PHP 自然排序

c++ - 理解 vector 初始化的问题

c++ - C++ 编译器如何将转义序列转换为实际字节?

c++ - 合并排序程序中的段错误

c++ - 具有不同类型的类