我还在学习如何使用标准库容器std::map
和std::unordered_map
。我最近尝试提供哈希功能或比较功能。
有两件事我不明白:
std::map<int, int, equal_to<int>> myMap1; // Works
std::map<int, int, hash<int>> myMap2; // Works
std::unordered_map<int, int, equal_to<int>> myMap3; // Doesn't work
std::unordered_map<int, int, hash<int>> myMap4; // Works
为什么我可以为std::map
提供哈希函数,而我无法为std::unordered_map
提供比较函数?
此外,如果我在比较函数std::equal_to
中使用自定义结构而不重载==
运算符,则不会出现错误。为什么会这样?
答案 0 :(得分:2)
标准C ++库中有一个名为&#34; concept&#34;的东西。概念是一组要求。通过使用std::unordered_map
(或任何遵循概念的内容),您同意遵守其声明的要求。
使用
std::map<int, int, equal_to<int>> myMap1;
std::map<int, int, hash<int>> myMap2;
std::unordered_map<int, int, equal_to<int>> myMap3;
您违反了std::map
和std::unordered_map
的要求 - 检查您的错误并不需要编译器,myMap1
,myMap2
和{{1}绝对不会正常工作。
恰好Hash要求它返回myMap3
类型的值。这很容易检查。
这与Compare不同,它指出了无法轻松检查的状态要求(例如,std::size_t
可转换为std::size_t
) - 因此,它的使用很可能在运行时失败。
此外,您似乎对哈希和比较函数的目的感到困惑 - 它们是不同的。
哈希为类型为bool
的任何值std::size_t
返回a, b
类型的值
T
那就是它 - 仅此而已。它应该比比较函数更快,因此您可以轻松地比较值 - 如果哈希值不同,则值肯定不同,如果哈希值相同,则进行完整比较。
答案 1 :(得分:1)
因为这两种结构非常不同:
具体来说,它是
二进制谓词,以两个元素键作为参数,返回 如果第一个参数位于第二个参数之前,则返回true 它定义的严格弱排序,否则为假。这将是一个 函数指针或函数对象。成员类型key_compare是 容器使用的内部比较对象类型,在map中定义 作为其第三个模板参数的别名(比较)。如果是key_compare 使用默认值较少(没有状态),此参数不是 相关的。
的报价比较函数对象,如果两个容器返回true 作为参数传递的对象键被认为是相等的。会员 type key_equal在unordered_map中定义为第四个别名 模板参数(Pred)。