vin*_*nzo 9 c++ hash set unordered-set
似乎当我尝试定义向量的 unordered_set 时,我收到一条错误消息:“调用隐式删除的默认构造函数unordered_set< vector<int> >
。” 当我定义常规(有序)集时不会发生这种情况:set< vector<int> >
。似乎我需要定义hash<vector<int>>
才能摆脱错误。
有谁知道为什么我只有在使用时才会收到此错误unordered_set
?不应该两个数据结构都使用散列,那么为什么 unordered_set 需要自定义散列函数?事实上,常规(有序)不应该也set
需要一些自定义的比较器来对vector<int>
数据结构进行排序吗?
小智 19
这是因为 unordered_set 使用 std::hash 模板来计算其条目的哈希值,并且没有用于配对的 std::hash 。您必须定义自定义哈希才能使用 unordered_set。
struct vector_hash
{
template <class T1, class T2>
std::size_t operator () (std::pair<T1, T2> const &v) const
{
return std::hash<T1>()(v.size());
}
};
Run Code Online (Sandbox Code Playgroud)
然后将您的 unordered_set 声明为 -
std::unordered_set< vector<int>, vector_hash> set;
Run Code Online (Sandbox Code Playgroud)
这个哈希函数不好。这只是一个例子。
两种数据结构不都应该使用哈希吗
不会。这是有文档记录的,您可以随时自行查找:
std::set
是一个关联容器,其中包含一组已排序的类型为 的唯一对象Key
。排序是使用键比较功能完成的Compare
。搜索、删除和插入操作具有对数复杂度。集合通常被实现为红黑树
请注意,Compare
默认为std::less<Key>
, 并std::vector
重载operator<
。
std::unordered_set
,用于比较
无序集是一个关联容器,包含一组 Key 类型的唯一对象。搜索、插入和删除具有平均恒定时间复杂度。
在内部,元素不按任何特定顺序排序,而是组织到存储桶中。元素被放入哪个桶中完全取决于其值的哈希值
Hash 类型参数默认为std::hash<Key>
。它有一个标准库类型的专业化列表,但std::vector
不包含在该列表中。