带有结构键的std :: map的高效比较器

时间:2015-04-23 15:54:10

标签: c++ dictionary comparator predicate stdmap

我有一个以下类型的结构,我计划将其用作地图中的键。 因此我写了一个比较如下的比较器。我想知道是否有更优雅而有效的方式来做到这一点 可能正在使用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;
  }
}

3 个答案:

答案 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);
}

结果,您只需要比较此密钥以了解内容是否相同。