按两个参数排序指针矢量

时间:2015-06-16 13:04:37

标签: c++ sorting vector

我正在尝试使用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 - offsetb->y > a->y + offset将其视为b->y == a->y,然后按其x坐标从最低到最大排序。如果上述情况不正确,请将其排序为b->y < a->y

我怎样才能做到这一点?

修改

想象一个像这样的xy平面:plane

其中黑点代表具有x和y坐标的A类。我想将这个平面分成有限多个部分,这些部分用红线表示,宽度为offset。现在我想将这些部分中的点视为具有相同的y坐标,并仅按x坐标对它们进行排序。

1 个答案:

答案 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)

您将AB置于offset坐标y之内,以便您比较A.xB.x并获取{{ 1}}。同样,您获得A<B,但B<CA不在C距离内,因此您获得offset,即A>C,永远不应该。 (如果我的订购错误,请调整坐标)。因此,您首先需要重新考虑订购概念。

如果(在编辑中指定)要分成水平条纹,并将条带内的点按x排序,则不应检查A<B<C<A的差异是否不超过{{1因为两个点的y的差异可以小于offset,但仍然位于不同的条带中。我建议明确计算条带数并比较它们,比如

y