为什么C ++ STL哈希表(unordered_map)不接受向量作为键

问题描述 投票:0回答:1

我认为选择这种设计是有原因的。 Boost seems to have an implementation for it,因此应该可以将向量用作哈希表键。应用于数组的哈希函数是否有任何理论上的属性,使其更易于发生冲突或其他不良行为?

c++ hash c++17 hashtable
1个回答
3
投票

您会注意到Boost does n't实际上具有扩展名,可以接受vector<T>作为键-而是具有扩展名,可让您使用任何Iterable-并且它仅以可迭代内容的功能...

这可能不希望,取决于:

  • 如果要使用对象标识而不是对象值作为哈希的基础...。
  • 如果您对将散列作为非恒定时间操作感到满意...还是不行。
    • 仅因为boost::hash_range似乎为O(n)并不意味着底层可迭代对象将不需要5分钟就可以为每个调用返回所有可哈希值...
  • 如果元素的顺序正确-或无关紧要。
    • ((我相信)将boost::hash_rangeboost::hash_combine与两个不同但等效]的对象之一一起使用[unordered_set对象将产生不同的哈希码,尽管它们的值相等。
  • 如果两个可以在相同值上进行迭代的概念上不同的对象(例如,vector<uint8_t>代表数据缓冲区,或者queue<SomeEnum>其中SomeEnum : uint8_t代表值队列)应该具有相同的hahs代码...或没有。
  • I suspect STL背后的团队不喜欢上面描述的上下文“ if”这么多,这意味着提供默认行为并不明智,因此他们要求您始终对任意对象的哈希生成更加明确(此外,如果您想要Boost的行为,则首先使用Boost-并不是Boost与STL竞争)。

    也请参见此质量检查:C++ unordered_map using a custom class type as the key

    © www.soinside.com 2019 - 2024. All rights reserved.