我有一个以下类型的结构,我计划将其用作地图中的键。
因此我写了一个比较如下的比较器。我想知道是否有更优雅而有效的方式来做到这一点
可能正在使用std::pair
或其他内容。
struct T
{
int a, b, c, d;
bool operator< (const T& r) {
if (a < r.a)
return true
else if (a == r.a)
if (b < r.b)
return true;
else if (b == r.b)
if (c < r.c)
return true;
else if (c == r.c)
if (d < r.d)
return true;
return false;
}
}
答案 0 :(得分:2)
你能用C ++ 11吗?如果是这样的话:
struct T {
int a, b, c, d;
bool operator<(const T& rhs) const {
return tied() < rhs.tied();
}
private:
std::tuple<int, int, int, int> tied() const {
return std::make_tuple(a, b, c, d);
}
};
或者,我希望return
尽可能地避免容易出错的笨拙嵌套方法:
bool operator<(const T& rhs) const {
if (a != rhs.a) return a < rhs.a;
if (b != rhs.b) return b < rhs.b;
if (c != rhs.c) return c < rhs.c;
return d < rhs.d;
}
答案 1 :(得分:0)
你可以使用......
bool operator<(const T& r)
{
return a < r.a ||
a == r.a && (b < r.b ||
b == r.b && (c < r.c ||
c == r.c && d < r.d));
}
或者...
return a != r.a ? a < r.a :
b != r.b ? b < r.b :
c != r.c ? c < r.c :
d < r.d;
你已经说过你没有使用C ++ 11,Barry很好地说明了一种元组方法,但是对于未来的参考和其他感兴趣的各方,只需要一点可重用的支持代码......
bool less_by_pairs()
{
return false;
}
template <typename T, typename U, typename ...Args>
bool less_by_pairs(const T& v1, const U& v2, Args... args)
{
return v1 != v2 ? v1 < v2 : less_by_pairs(args...);
}
...您可以更轻松地实施此类运营商......
bool operator<(const T& r)
{
return less_by_pairs(a, r.a, b, r.b, c, r.c, d, r.d);
}
你可以做一些类似的事情,提供一个要比较的成员列表,但是这个的表示法实际上有点冗长。
答案 2 :(得分:-1)
您可以使用其他字段来存储密钥。可以通过公式生成此键值,该公式将输入(a,b,c,d)
像这样:
void hash()
{
key = (a ^ b ^ c ^ d);
}
结果,您只需要比较此密钥以了解内容是否相同。