为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
Why C++ STL hash table (unordered_map) doesn't accept vectors as keys
我认为这种设计选择背后是有原因的。Boost 似乎有一个实现,因此应该可以使用向量作为哈希表键。应用于数组的哈希函数是否有任何理论属性,使它们更容易发生冲突或其他不良行为?
你会注意到 Boost 实际上并没有专门接受vector<T>
作为键的扩展 - 相反,它有一个扩展,允许您使用任何Iterable
- 并且它仅生成哈希作为可迭代内容的功能......
这可能是可取的,也可能是不可取的,具体取决于:
- 如果你想使用对象-身份而不是对象-值作为散列的基础......或不。
- 如果您对散列是一种非恒定时间操作感到满意......或不。
- 仅仅因为
boost::hash_range
看起来很O(n)
并不意味着底层可迭代对象不会花费 5 分钟来返回每个调用的所有可哈希值......
- 仅仅因为
- 如果元素的顺序很重要 - 或者无关紧要。
- (我相信(将
boost::hash_range
或boost::hash_combine
与两个不同但等效的unordered_set
对象之一一起使用将导致不同的哈希代码,尽管它们的值等效。
- (我相信(将
- 如果两个概念上不同的对象可以迭代相同的值(例如,表示数据缓冲区的
vector<uint8_t>
,或者SomeEnum : uint8_t
表示值队列的queue<SomeEnum>
(应该具有相同的 hahs 代码......或不。
我怀疑STL 背后的团队不喜欢上面描述的这么多上下文"如果"这一事实,这意味着提供默认行为是不明智的,因此他们要求您始终更明确地生成任意对象的哈希值(此外,如果您想要 Boost 的行为,那么首先只需使用 Boost - 这不像 Boost 与 STL 竞争(。
另请参阅此 QA:使用自定义类类型作为键C++ unordered_map
相关文章:
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么线程不接受此输入?
- 函数不接受 X 参数,函数使用默认参数
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- B不接受8作为输入的是什么?C++
- C++数组输入不接受一定数量的整数
- C++概念assignable_from不接受 const&-return 运算符=
- 斯堪夫不接受输入
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- C++字符数组不接受超过 4 个字符的输入
- CIN不接受C++中带有空格的输入?
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- 为什么不接受具有默认分配参数的函数作为 0-arg 生成器?
- 模板接受常量,但不接受文字
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么 strtok_r() 只接受字符数组而不接受字符指针
- C++ cout 不接受字符串或带 + 的字符串
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- std::cin不接受输入
- 带有openSSL的libwebsocket服务器不接受连接