将一个向量对放在一个无序映射与一个映射中
Putting a vector of pairs in an unordered_map vs a map
所以考虑一下这个代码:
#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_map
s和将vector
s作为密钥放在其中是什么呢?这是怎么回事?
要对此进行详细说明:对于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无法计算键的散列,这也是错误消息告诉您的。
相关文章:
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 将一个向量对放在一个无序映射与一个映射中
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- 如何将键和值从映射传输到另一个映射?
- 在插入时同时迭代一个映射,这在什么方面是不安全的
- 如何制作一个C++映射容器,其中键是值的一部分
- 将一个映射插入到同一多重映射的另一个映射中会导致 SEG 错误
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- 如何将键值对引用从一个映射复制到同一类型的另一个映射
- 在C++中,如何创建一个映射,其值是protobuf扩展标识符
- C++:使用映射作为另一个映射的值
- 我可以有一个C++映射,其中多个键引用该值而不使用指针吗
- 我想开发一个函数,它接受任何类型的向量并返回一个映射(类似于 python 中的计数器)
- 如何用一对向量输出一个映射
- 如何在c++中根据另一个映射对一个映射进行排序
- 我将如何读取这个文件到一个映射c++
- 我们可以在c++中制作一个映射,将值作为键的函数
- 用map-values初始化一个映射
- 在c++中返回一个映射,用作lua中的表