Оператор Implementing <в C++

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

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

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

14
задан Agnel Kurian 9 June 2010 в 13:55
поделиться

4 ответа

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

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;
    }
}
5
ответ дан 1 December 2019 в 06:15
поделиться

Я думаю, что есть недопонимание относительно того, что map требует.

map не требует, чтобы в вашем классе был определен operator <. Он требует передачи подходящего предиката сравнения, который по умолчанию имеет значение std :: less , который использует operator < в Key .

Вы не должны реализовывать operator <, чтобы соответствовать вашему ключу в карте . Его следует реализовывать только в том случае, если вы определяете его для этого класса: то есть, если он имеет смысл.

Вы можете идеально определить предикат:

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;
15
ответ дан 1 December 2019 в 06:15
поделиться

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

До 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);
}
35
ответ дан 1 December 2019 в 06:15
поделиться

Вы могли бы сделать:

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

, но в этом есть много недостатков - например, нет vtbl и еще много чего, я уверен.

-4
ответ дан 1 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: