调用 'unordered_set< vector<int> >' 隐式删除的默认构造函数

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)

这个哈希函数不好。这只是一个例子。

  • 为什么“vector&lt;int&gt;”的“unordered_set”需要“pair”的哈希函数?难道它不需要 `vector&lt;int&gt;` 的哈希函数吗? (11认同)
  • 如果您正在寻找一个好的哈希函数对 &lt;int,int&gt; /sf/answers/47783221/ (2认同)

Use*_*ess 6

两种数据结构不都应该使用哈希吗

不会。这是有文档记录的,您可以随时自行查找:

  • std::set

    std::set是一个关联容器,其中包含一组已排序的类型为 的唯一对象Key。排序是使用键比较功能完成的Compare。搜索、删除和插入操作具有对数复杂度。集合通常被实现为红黑树

    请注意,Compare默认为std::less<Key>, 并std::vector重载operator<

  • std::unordered_set,用于比较

    无序集是一个关联容器,包含一组 Key 类型的唯一对象。搜索、插入和删除具有平均恒定时间复杂度。

    在内部,元素不按任何特定顺序排序,而是组织到存储桶中。元素被放入哪个桶中完全取决于其值的哈希值

    Hash 类型参数默认为std::hash<Key>。它有一个标准库类型的专业化列表,但std::vector不包含在该列表中。