繁体   English   中英

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

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

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

您会注意到 Boost 实际上并没有扩展来专门接受vector<T>作为键 - 相反,它具有允许您使用任何Iterable的扩展 - 并且它仅生成 hash 作为 Iterable 内容的 function。 ..

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM