没有必需函数的std :: hash vs std :: equal_to实例化

时间:2014-05-28 19:18:39

标签: c++ map std unordered-map

我还在学习如何使用标准库容器std::mapstd::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中使用自定义结构而不重载==运算符,则不会出现错误。为什么会这样?

2 个答案:

答案 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::mapstd::unordered_map的要求 - 检查您的错误并不需要编译器,myMap1myMap2和{{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   使用默认值较少(没有状态),此参数不是   相关的。

  • unordered_map基本上是一个哈希表(它没有有序状态)并且期望一个哈希函数,你没有传递一个哈希函数。
  

比较函数对象,如果两个容器返回true   作为参数传递的对象键被认为是相等的。会员   type key_equal在unordered_map中定义为第四个别名   模板参数(Pred)。

来自http://www.cplusplus.com

的报价