使用哈希访问unordered_set的元素

时间:2015-12-08 18:42:51

标签: c++ unordered-set

template<class T>
struct handle{
   ...
   std::size_t index;
   ...
};

template<class T>
struct foo{
  ...
  struct eq {
    bool operator()(const std::shared_ptr<handle<T>> &a,
                    const std::shared_ptr<handle<T>> &b) const
    {
      return a->index == b->index;
    }
  };

  struct hash {
    std::size_t operator()(const std::shared_ptr<handle<T>> &a) const
    {
      return a->index;
    }
  };
  std::unordered_set <std::shared_ptr<handle<T>>, hash, eq> handle_set;

...
};

handle_set是一些std::vector<T>的视图。我基本上想检查某人是否有对该向量中的元素的引用,如此

std::size_t index_from_vector = 5;
if(handle_set.count(index_from_vector)){
  //handle exisits 
}

但这不起作用,因为unordered_set需要密钥类型,所以我必须这样做

auto sp = std::make_shared<handle<T>>(..,index_from_vector,..);

if(handle_set.count(sp)){
  //handle exisits 
}

这意味着如果我想检查向量中是否存在特定元素的句柄,我总是必须创建一个虚拟shared_ptr

有没有办法只使用哈希访问unordered_set

我目前使用unordered_map作为此

std::unordered_map<std::size_t, std::shared_ptr<handle<T>>> handle_map;

但更新handle_map有点痛苦,因为我需要更新handle.index和密钥。这有点尴尬,unordered_set会大大简化这一点。

也许还有另一种更适合的数据结构?

0 个答案:

没有答案