[英]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_range
或boost::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.