我有一个奇怪的问题,也许我错过了一些明显的东西,但我无法说出来。
这是抛出断言的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 ...
你能告诉我这有什么问题吗?
答案 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;}
);