C ++无效的比较器

时间:2017-05-31 07:13:22

标签: 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 ...

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

2 个答案:

答案 0 :(得分:2)

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

将功能更改为:

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

一切都按预期工作。

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

答案 1 :(得分:0)

根据sort的参考,比较器必须:

  

比较函数对象(即满足比较要求的对象)如果第一个参数小于(即在之前排序)第二个,则返回true。   比较函数的签名应等同于以下内容:

     

bool cmp(const Type1&amp; a,const Type2&amp; b);

我想你真正想要的是以下内容:

   std::sort(points.begin(), points.end(), 
         [] (const Vector2D& a1, const Vector2D&a2){return a1.x < a2.x;}
      );