因此,请考虑以下代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
unordered_map<vector<pair<int,int>>,int> mp ;
for(int i=0;i<10;i++)
{
vector<pair<int,int>> v ;
for(int j=0;j<10;j++)
v.push_back(make_pair(j,2*j)) ;
mp[v] = i ;
}
return 0;
}
我在这里正在用unordered_map
类型的键创建一个vector<pair<int,int>>
。如您所见here,这将引发一个错误。
但是当我将此unordered_map
更改为map
时,this error doesn't occur anymore。那是:
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<vector<pair<int,int>>,int> mp ;
for(int i=0;i<10;i++)
{
vector<pair<int,int>> v ;
for(int j=0;j<10;j++)
v.push_back(make_pair(j,2*j)) ;
mp[v] = i ;
}
return 0;
}
效果很好。
那么unordered_map
是什么,然后将vector
作为键放在其中?这是怎么回事?
详细说明一下:对于std::map:
std :: map是一个排序的关联容器,其中包含具有唯一键的键/值对。键通过使用比较函数Compare进行排序。 [...]地图通常以红黑树的形式实现。
Said “ function Compare”是具有默认值std::less<Key>
的模板参数。因此,地图需要使用<
比较值以将其分类为红黑树。 std::vector
支持(这样的比较)[https://en.cppreference.com/w/cpp/container/vector/operator_cmp]。
std::unoredered_map在另一个哈希上,需要使用哈希函数将密钥放入哈希存储桶中。使用的哈希函数是一个模板参数,默认值为std::hash<Key>
。
std::hash
仅对vector<bool>
具有重载,而对于任何通用向量均没有。除非您提供自定义哈希函数,否则unordered_map无法计算键的哈希,这也就是错误消息告诉您的内容。