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;
}

しかし、それはうまくいきません。あるクラス/構造体オブジェクトが全体として別のオブジェクトよりも小さいと判断するにはどうすればよいですか?位置構造体に対してどのようにすればよいですか?

編集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を使用して、およびの要素への参照を含む2つのstd::tuple<int const&, int const&>オブジェクトを作成し、 operator <辞書式比較を実行する)を使用して2つのタプルを比較します。xyonetwo

std::tieC ++ 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 に答える