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

Why C++ STL hash table (unordered_map) doesn't accept vectors as keys

本文关键字:不接受 向量 map STL C++ 哈希表 unordered 为什么      更新时间:2023-10-16

我认为这种设计选择背后是有原因的。Boost 似乎有一个实现,因此应该可以使用向量作为哈希表键。应用于数组的哈希函数是否有任何理论属性,使它们更容易发生冲突或其他不良行为?

你会注意到 Boost 实际上并没有专门接受vector<T>作为键的扩展 - 相反,它有一个扩展,允许您使用任何Iterable- 并且它仅生成哈希作为可迭代内容的功能......

这可能是可取的,也可能是不可取的,具体取决于:

  • 如果你想使用对象-身份而不是对象-值作为散列的基础......或不。
  • 如果您对散列是一种非恒定时间操作感到满意......或不。
    • 仅仅因为boost::hash_range看起来很O(n)并不意味着底层可迭代对象不会花费 5 分钟来返回每个调用的所有可哈希值......
  • 如果元素的顺序很重要 - 或者无关紧要。
    • (我相信(将boost::hash_rangeboost::hash_combine与两个不同但等效unordered_set对象之一一起使用将导致不同的哈希代码,尽管它们的值等效。
  • 如果两个概念上不同的对象可以迭代相同的值(例如,表示数据缓冲区的vector<uint8_t>,或者SomeEnum : uint8_t表示值队列的queue<SomeEnum>(应该具有相同的 hahs 代码......或不。

怀疑STL 背后的团队不喜欢上面描述的这么多上下文"如果"这一事实,这意味着提供默认行为是不明智的,因此他们要求您始终更明确地生成任意对象的哈希值(此外,如果您想要 Boost 的行为,那么首先只需使用 Boost - 这不像 Boost 与 STL 竞争(。

另请参阅此 QA:使用自定义类类型作为键C++ unordered_map