我正在尝试使用std :: sort对指向A类的指针进行排序,但是遇到了一些困难。
想象一下A类只是一个点,包含x和y坐标。我想使用一些固定的偏移值按y坐标从最大到最低排序矢量。最重要的是,我希望按x坐标x从最低到最大排序。我有一些类似记忆的东西,但你可以想象它不按预期工作:
bool A::sortByCoordinates(const A *a, const A *b)
{
if ((b->y < a->y - offset) || (b->y > a->y + offset)) {
return false;
} else if (b->x < a->x) {
return true;
}
return false;
}
void A::recalculate(std::vector<A *> &test)
{
std::sort(test.begin(), test.end(), sortByCoordinates);
}
简而言之,如果b->y < a->y - offset
或b->y > a->y + offset
将其视为b->y == a->y
,然后按其x坐标从最低到最大排序。如果上述情况不正确,请将其排序为b->y < a->y
。
我怎样才能做到这一点?
修改
想象一个像这样的xy平面:
其中黑点代表具有x和y坐标的A类。我想将这个平面分成有限多个部分,这些部分用红线表示,宽度为offset
。现在我想将这些部分中的点视为具有相同的y坐标,并仅按x坐标对它们进行排序。
答案 0 :(得分:1)
(b->y < a->y - offset) || (b->y > a->y + offset)
这是两种不同的情况,应该有不同的结果。我认为b
是&#34;较少&#34;然后在第一种情况下a
,并且&#34;更大&#34;}在另一种情况下,但是对于这两种情况,您的代码都返回false。请参阅@ Jonathan关于如何解决此问题的答案。
但是请注意,你的方法(考虑所有相差小于offset
的y)有一个重大缺陷:它不会产生strict total order。假设您有offset=3
和三个点A(x=0,y=0)
,B(x=-2,y=2)
和C(x=-4,y=4)
。
您将A
和B
置于offset
坐标y
之内,以便您比较A.x
和B.x
并获取{{ 1}}。同样,您获得A<B
,但B<C
和A
不在C
距离内,因此您获得offset
,即A>C
,永远不应该。 (如果我的订购错误,请调整坐标)。因此,您首先需要重新考虑订购概念。
如果(在编辑中指定)要分成水平条纹,并将条带内的点按x排序,则不应检查A<B<C<A
的差异是否不超过{{1因为两个点的y
的差异可以小于offset
,但仍然位于不同的条带中。我建议明确计算条带数并比较它们,比如
y