为什么 C++ STL 哈希 table (unordered_map) 不接受向量作为键
Why C++ STL hash table (unordered_map) doesn't accept vectors as keys
我认为这种设计选择背后是有原因的。 Boost seems to have an implementation for it,因此应该可以使用向量作为散列 table 键。应用于数组的哈希函数是否有任何理论属性使它们更容易发生冲突或其他不良行为?
您会注意到 Boost 实际上没有一个扩展来专门接受 vector<T>
作为密钥——相反它有一个扩展允许您使用任何Iterable
- 它仅根据 Iterable 的内容生成散列...
这可能需要也可能不需要,具体取决于:
- 如果你想使用对象标识而不是对象值作为散列的基础......或者不。
- 如果您认为散列是一种非恒定时间操作……或者不是。
- 只是因为
boost::hash_range
看起来是 O(n)
并不意味着底层的迭代不会花费 5 分钟来 return 每次调用的所有可散列值...
- 如果元素的顺序重要或无关紧要。
- (我相信)将
boost::hash_range
或 boost::hash_combine
与两个不同但 等价的 unordered_set
对象之一一起使用将导致不同的散列-代码尽管它们的值等价。
- 如果可以迭代相同值的两个概念不同的对象(例如
vector<uint8_t>
表示数据缓冲区,或 queue<SomeEnum>
其中 SomeEnum : uint8_t
表示值队列)应该具有相同的 hahs 代码...或不相同。
我 怀疑 STL 背后的团队不喜欢上面描述的这么多上下文 "if" 的事实,这意味着它是不明智的提供默认行为,因此它们要求您始终对任意对象的哈希生成更加明确(此外,如果您想要 Boost 的行为,那么首先使用 Boost——这不像是 Boost 与 STL 竞争) .
另请参阅此质量检查:C++ unordered_map using a custom class type as the key
我认为这种设计选择背后是有原因的。 Boost seems to have an implementation for it,因此应该可以使用向量作为散列 table 键。应用于数组的哈希函数是否有任何理论属性使它们更容易发生冲突或其他不良行为?
您会注意到 Boost 实际上没有一个扩展来专门接受 vector<T>
作为密钥——相反它有一个扩展允许您使用任何Iterable
- 它仅根据 Iterable 的内容生成散列...
这可能需要也可能不需要,具体取决于:
- 如果你想使用对象标识而不是对象值作为散列的基础......或者不。
- 如果您认为散列是一种非恒定时间操作……或者不是。
- 只是因为
boost::hash_range
看起来是O(n)
并不意味着底层的迭代不会花费 5 分钟来 return 每次调用的所有可散列值...
- 只是因为
- 如果元素的顺序重要或无关紧要。
- (我相信)将
boost::hash_range
或boost::hash_combine
与两个不同但 等价的unordered_set
对象之一一起使用将导致不同的散列-代码尽管它们的值等价。
- (我相信)将
- 如果可以迭代相同值的两个概念不同的对象(例如
vector<uint8_t>
表示数据缓冲区,或queue<SomeEnum>
其中SomeEnum : uint8_t
表示值队列)应该具有相同的 hahs 代码...或不相同。
我 怀疑 STL 背后的团队不喜欢上面描述的这么多上下文 "if" 的事实,这意味着它是不明智的提供默认行为,因此它们要求您始终对任意对象的哈希生成更加明确(此外,如果您想要 Boost 的行为,那么首先使用 Boost——这不像是 Boost 与 STL 竞争) .
另请参阅此质量检查:C++ unordered_map using a custom class type as the key