boost::extension.hpp 没有为无序容器和其他一些容器定义 hash_value() 的原因

Reason for boost::extension.hpp does not defining hash_value() for unordered and some other containers

来自 boost 文档:

 It also implements the extension proposed by Peter Dimov in issue 6.18 of the Library Extension Technical Report Issues List (page 63), this adds support for:
...
**the standard containers**
...

但是,在查看 extension.hpp 中的实现(提升版本 1.71)时,我可以看到只有数组、向量、列表、双端队列、集合、多重集、映射、多重映射有专门化。缺少其他容器 forward_list、unordered_set、unordered_multiset、unordered_map 和 unordered_multimap,以及容器适配器堆栈、队列和 priority_queue .虽然后者似乎或多或少是合理的(因为后面的容器是另一个容器,只是界面改变了),但我至少想知道其他容器。只是还没有整合,是不是被遗忘了,是因为草案没有给它们命名(为什么?)还是有什么特殊的原因?

注意:
我在 SO
上知道这个问题 Why doesn't boost::hash_value support boost::unordered_set by default?
但我认为这个问题主要是问一个集合中的一个集合,而且这个问题已有 6 年历史(今天可能会导致不同的答案),这就是我问这个问题的原因。

我也知道在完整容器上构建散列既不是持续访问也不是高性能,我们不需要讨论这个。有时您必须根据运行时更改内存消耗(在这种情况下使用 boost::flyweight 但这需要哈希)。如果 class 有一个容器作为成员,那么,你就在那里(如果你不允许更改 class 本身)。

无序容器在很大程度上具有不相关的 non-repeatable 哈希值。

这是因为 hash(a,b,c) 与 hash(b,a,c) 或 hash(c, a, b) 等不同

由于排序不能依赖,只能隐式控制,你永远不会知道“相同的散列”意味着什么。用于查找的散列的主要规则是等效值应散列为相同的值,但由于作为无序容器的不同集 {a,b,c} 可能散列为不同的值,而等效这会破坏语义。

当然,您可以对集合进行排序,然后对其进行哈希处理,但这样做的成本似乎高得令人望而却步 - 这是不默认提供它的一个很好的理由。


至于为什么 forward_list 被排除在外,我不太确定。这看起来像是简单的疏忽。