我想在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 <>来完成?
答案 0 :(得分:6)
map
要求实现小于比较。是矢量。但是unordered_map
需要一个哈希函数,您需要自己实现。没什么大不了的,您可以在此处查看如何使用hash_combine
来做到这一点:Fast hash function for `std::vector`
答案 1 :(得分:1)
接下来是@JohnZwinck的(出色)答案,我想说,将std::unordered_map
与vector
用作键通常是一个坏主意,因为实施任何一种有效的哈希函数。
John给出的链接对此进行了扩展,但从本质上讲,每次需要对任何哈希进行哈希运算时,哈希函数都必须检查向量中的每个元素。如果向量很大,那么 ouch!
因此,std::map
可能是一个更好的选择,因为std::less
(-> operator<
)可能很便宜-只要我们点击向量的元素,两个操作数之间的值不同,我们就完成了。最坏的情况是,它不再昂贵(尽管确实存在便宜而有效的散列函数,尤其是例如,如果键是类似{的东西,那么std::unordered_map
比std::map
更有效) {1}}。