"的最佳数据结构设置为类成员为关键"?

时间:2017-02-09 13:32:37

标签: c++ c++14 std

我有这个数据结构:

class foo {
   class bar key;
   … some_associated_values …
};

我现在想要使用它构建一个unordered_set / map /。我的问题是C ++ 14不支持单独使用密钥来查找集合的成员,因此unordered_set不存在。使用map需要拆分值类,或者复制键,但两者都需要对我现有的代码库进行一些侵入性的重构。

像这样的映射的理想数据结构似乎是std::pair<const class key&, class value>(用引用替换值类中的键也可以) - 但是我如何初始化它,最好是以可移植的方式?

1 个答案:

答案 0 :(得分:2)

  

我的问题是C ++ 14不支持单独使用密钥来查找集合的成员

在C ++ 14中,您可以使用std::set但不能使用std::unordered_set(因为无序容器不支持异构查找):

#include <set>
#include <assert.h>

struct bar { int i; };

bool operator<(const bar& l, const bar& r) { return l.i < r.i; }

struct foo
{
  bar key;
  int val;
};

struct cmp
{
  using is_transparent = void;

  bool operator()(const foo& l, const foo& r) const
  {
    return l.key < r.key;
  }

  bool operator()(const foo& l, const bar& r) const
  {
    return l.key < r;
  }

  bool operator()(const bar& l, const foo& r) const
  {
    return l < r.key;
  }
};

int main()
{
  std::set<foo, cmp> s;
  s.insert(foo{{0}, 1});
  s.insert(foo{{2}, 3});

  auto pos = s.find(bar{0});
  assert( pos != s.end() );
  assert( pos->key.i == 0 );
  assert( pos->val == 1 );

  pos = s.find(bar{1});
  assert( pos == s.end() );

  pos = s.find(bar{2});
  assert( pos != s.end() );
  assert( pos->key.i == 2 );
  assert( pos->val == 3 );
}

(P.S。possible使用unordered_map制作一些内容,但它很卑鄙且容易出错。)