将一个向量对放在一个无序映射与一个映射中

Putting a vector of pairs in an unordered_map vs a map

本文关键字:一个 映射 无序 向量      更新时间:2023-10-16

所以考虑一下这个代码:

#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;
}

我在这里所做的是创建一个具有类型为vector<pair<int,int>>的键的unordered_map。正如您在这里看到的,这会引发一个错误。

但是当我将这个unordered_map更改为一个map时,这个错误就不会再发生了。即:

#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_maps和将vectors作为密钥放在其中是什么呢?这是怎么回事?

要对此进行详细说明:对于std::map:

std::map是一个排序的关联容器,包含具有唯一键的键值对。按键通过使用比较功能Compare进行排序。[…]地图通常被实现为红黑树。

所说的"函数比较">是一个默认值为std::less<Key>的模板参数。因此,映射需要使用<来比较值,以便将它们排序到红黑树中。std::vector支持(这样的比较([https://en.cppreference.com/w/cpp/container/vector/operator_cmp]。

另一个散列上的std::unordered_map需要一个散列函数将密钥放入散列桶中。使用的哈希函数是一个默认值为std::hash<Key>的模板参数。

std::hash仅具有用于vector<bool>的过载,而不具有用于任何通用向量的过载。除非您提供一个自定义的散列函数,否则undered_map无法计算键的散列,这也是错误消息告诉您的。