为什么我不能使用对作为unordered_set/unordered_map的键?
Why can't I use pair as key of unordered_set / unordered_map?
std::set<>
和std::map<>
都可以使用std::pair
作为密钥,但std::unordered_set<>
和std::unordered_map<>
为什么不能呢?
unordered_set<pair<int,int> > S;
S.insert(make_pair(0, 1));
不编译
unordered_*
容器需要一个哈希函数。默认情况下,它们使用std::hash
,但是标准库中没有为std::pair<T1,T2>
提供std::hash
的专门化。另一方面,有序的容器依赖于std::less
(默认情况下),而std::pair
不提供 operator<
。这就是为什么它很有效。
为了拥有一个具有pair
的无序容器,您必须自己提供一个哈希函函数。例如:
struct SimpleHash {
size_t operator()(const std::pair<int, int>& p) const {
return p.first ^ p.second;
}
};
std::unordered_set<std::pair<int, int>, SimpleHash> S;
S.insert(std::make_pair(0, 1));
您需要为pair提供一个哈希函数
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>