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
会大大简化这一点。
也许还有另一种更适合的数据结构?