1

我有一个简单的 Position 结构:

struct Position
{
    int x;
    int y;
};

我还有一个职位列表:

std::list<Position> positons;

我正在尝试使用 list::sort() 对列表进行排序,并且需要为 Positions 对象定义 operator<。我尝试保持简单,创​​建类似:

bool operator<(const Position& one, const Position& two)
{
    return one.x < two.x && one.y < two.y;
}

但这不起作用。如何确定一个类/结构对象作为一个整体小于另一个?我将如何为我的 Position 结构做这件事?

编辑当我调用positions.sort()时,我得到一个调试断言失败,它说:表达式:无效的运算符<

4

4 回答 4

3

您当前的定义没有建立严格的弱顺序。尝试类似:

bool operator<(const Position& one, const Position& two)
{
    return std::tie(one.x, one.y) < std::tie(two.x, two.y);
}

这使用std::tie创建两个std::tuple<int const&, int const&>对象,其中包含对 and 的和元素的引用,x然后y使用operator <比较两个元组(执行字典比较)。onetwo

std::tie需要 C++11,但使用boost::tuple可以获得类似的结果。

于 2012-11-22T06:12:35.330 回答
2

您可以按与原点的距离或大小对您的位置进行排序,如下所示:

std::vector<Position> Foo;
std::sort(Foo.begin(), Foo.end(), [](Position& a, Position& b) {return (abs(a.x) + abs(a.y)) <  (abs(b.x) + abs(b.y)); });
于 2012-11-22T06:25:36.090 回答
1

您可以按 x 排序,然后按 y 排序。也将其定义为自由函数:

bool function(const Position& one, const Position& two)
{
    return one.x < two.x || (one.x == two.x && one.y < two.y);
}

或作为operator

bool operator<(const Position& other)const
{
    return x < other.x || (x == other.x && y < other.y);
}
于 2012-11-22T06:15:59.813 回答
0

最简单的解决方案是放弃struct并使用

typedef std::array< int, 2 > Position; // C++11, access pos[0] and pos[1]

或者

typedef std::pair< int, int > Position; // C++03, access pos.first and pos.second

这些类operator<(以及您可能需要的所有其他运算符)已预定义。不能调用坐标.x.y,但总比重新发明轮子好。

如果你真的想要,还有一个技巧可以以一种方式调用std::arrayasx和的成员y

enum coord_name { x, y, z };

template< typename lhs_t >
auto operator ->* ( lhs_t &&lhs, coord_name rhs )
    -> decltype( lhs[ + rhs ] )
    { return lhs[ + rhs ]; }

Position coords;
std::array< float, 3 > coords_3d_floating;

// usage:
coords->*x = 8;
coords->*y = coords_3d_floating->*z * 1.5;

这需要 C++11。

于 2012-11-22T06:38:36.497 回答