16

次のようないくつかの数値フィールドを持つクラスがあります。

class Class1 {
    int a;
    int b;
    int c;
public:
    // constructor and so on...
    bool operator<(const Class1& other) const;
};

このクラスのオブジェクトを のキーとして使用する必要がありますstd::map。したがって、私は実装しoperator<ます。operator<ここで使用する最も簡単な実装は何ですか?

編集: の意味は<、フィールドのいずれかが等しくない限り、一意性を保証するために想定できます。

編集2:

単純な実装:

bool Class1::operator<(const Class1& other) const {
    if(a < other.a) return true;
    if(a > other.a) return false;

    if(b < other.b) return true;
    if(b > other.b) return false;

    if(c < other.c) return true;
    if(c > other.c) return false;

    return false;
}

この投稿の背後にある全体的な理由は、上記の実装が冗長すぎると感じたからです。もっと単純なものがあるはずです。

4

5 に答える 5

37

辞書式順序付けを実装したいと思います。

C++11 より前:

#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
bool Class1::operator<(const Class1& other) const
{
    return boost::tie(a, b, c) < boost::tie(other.a, other.b, other.c);
}

C++11 以降:

#include <tuple>
bool Class1::operator<(const Class1& other) const
{
    return std::tie(a, b, c) < std::tie(other.a, other.b, other.c);
}
于 2010-06-09T13:51:29.697 に答える
15

map何が必要かについて誤解があると思います。

mapoperator<クラスが定義されている必要はありません。適切な比較述語を渡す必要があります。これは、便利なデフォルトで、std::less<Key>で使用operator<されますKey

operator<キーをに合わせるように実装しないでくださいmap。このクラスに対して定義する場合、つまり意味がある場合にのみ実装する必要があります。

述語を完全に定義できます。

struct Compare: std::binary_function<Key,Key,bool>
{
  bool operator()(const Key& lhs, const Key& rhs) const { ... }
};

その後:

typedef std::map<Key,Value,Compare> my_map_t;
于 2010-06-09T14:31:47.703 に答える
6

順序が重要かどうかによって異なります。そうでない場合は、これを行うことができます:

bool operator<(const Class1& other) const
{
    if(a == other.a)
    {
         if(b == other.b)
         {
             return c < other.c;
         }
         else
         {
             return b < other.b;
         }
    }
    else
    {
        return a < other.a;
    }
}
于 2010-06-09T13:55:23.737 に答える
-4

あなたがすることができます:

return memcmp (this, &other, sizeof *this) < 0;

しかし、それには非常に多くの注意事項があります。たとえば、vtbl はありません。

于 2010-06-09T13:54:40.487 に答える