У меня есть класс с несколькими числовыми полями, такими как:
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;
}
Целая причина позади этого сообщения состоит просто в том, что я нашел вышеупомянутую реализацию слишком подробной. Должно быть что-то более простое.
Это зависит от того, важно ли для вас упорядочивание. Если нет, вы можете просто сделать вот это:
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;
}
}
Я думаю, что есть недопонимание относительно того, что 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;
Я предполагаю, что вы хотите реализовать лексикографический порядок.
До 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);
}
Вы могли бы сделать:
return memcmp (this, &other, sizeof *this) < 0;
, но в этом есть много недостатков - например, нет vtbl и еще много чего, я уверен.