与map和unordered_map相关的编译错误:“试图引用已删除的函数”

时间:2018-07-07 05:39:02

标签: c++ c++11

我想在C ++ STL中使用map在vector和int之间创建关联。但是我在下面的代码中遇到了多个编译错误:

#include <vector>
#include <map>
#include <unordered_map>

using namespace std;

int main(void)
{
    unordered_map<vector<char>, int> mp;
    return 0;
}

并在VC ++中出现此编译错误:

错误C2280:'std :: hash <_Kty> :: hash(const std :: hash <_Kty>&)':试图引用已删除的函数

但是,如果我按如下所示更改代码,则可以正确编译代码:

#include <vector>
#include <map>
#include <unordered_map>

using namespace std;

int main(void)
{
    map<vector<char>, int> mp;
    return 0;
}

我在StackoverFlow中发现了这个问题,其标题是: 使用自定义类类型作为键的C ++ unordered_map。 但是我想知道为什么使用map <>可以通过编译检查,但是不能通过unordered_map <>来完成?

2 个答案:

答案 0 :(得分:6)

map要求实现小于比较。是矢量。但是unordered_map需要一个哈希函数,您需要自己实现。没什么大不了的,您可以在此处查看如何使用hash_combine来做到这一点:Fast hash function for `std::vector`

答案 1 :(得分:1)

接下来是@JohnZwinck的(出色)答案,我想说,将std::unordered_mapvector用作键通常是一个坏主意,因为实施任何一种有效的哈希函数。

John给出的链接对此进行了扩展,但从本质上讲,每次需要对任何哈希进行哈希运算时,哈希函数都必须检查向量中的每个元素。如果向量很大,那么 ouch!

因此,std::map可能是一个更好的选择,因为std::less(-> operator<)可能很便宜-只要我们点击向量的元素,两个操作数之间的值不同,我们就完成了。最坏的情况是,它不再昂贵(尽管确实存在便宜而有效的散列函数,尤其是例如,如果键是类似{的东西,那么std::unordered_mapstd::map更有效) {1}}。