Реализация оператора <в С++

У меня есть класс с несколькими числовыми полями, например:

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

Мне нужно использовать объекты этого класса в качестве ключа в std::map. Поэтому я реализую operator<. Какова самая простая реализация operator< для использования здесь?

EDIT: Значение < можно принять так, чтобы гарантировать уникальность, если любое из полей неравномерно.

ИЗМЕНИТЬ 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;
}

Вся причина этого сообщения в том, что я нашел вышеприведенную реализацию слишком многословной. Там должно быть что-то более простое.

Ответы

Ответ 1

Это зависит от того, является ли заказ для вас каким-то важным. Если нет, вы можете просто сделать это:

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

Ответ 2

Я предполагаю, что вы хотите реализовать лексикографическое упорядочение.

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

Ответ 3

Я думаю, что есть недоразумение в отношении того, что требуется map.

map не требует, чтобы ваш класс имел operator<. Для этого требуется подходящий предикат сравнения, который по умолчанию имеет значение 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;

Ответ 4

Вы можете сделать:

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

но в этом есть много предостережений - например, нет vtbl, и я уверен, что еще больше.