我有一个包含几个数字字段的类,例如:
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;
}
这篇文章背后的全部原因只是我发现上面的实现过于冗长。应该有更简单的事情。
答案 0 :(得分:34)
我假设你想要实现词典排序。
在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);
}
答案 1 :(得分:15)
我认为对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;
答案 2 :(得分: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;
}
}
答案 3 :(得分:0)
避免多次缩进的版本是
bool operator<(const Class1& other) const
{
if(a != other.a)
{
return a < other.a;
}
if(b != other.b)
{
return b < other.b;
}
return c < other.c;
}
&#34;编辑2&#34;作者的版本平均比这个解决方案有更多的比较。 (最坏情况6到最差情况3)
答案 4 :(得分:-4)
你可以这样做:
return memcmp (this, &other, sizeof *this) < 0;
但这有很多警告 - 例如没有vtbl,而且我确定更多。