问题描述
来自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以及容器适配器堆栈,queue和priority_queue均丢失。尽管后者似乎有些合理(由于后面的容器是另一个容器,只是界面发生了变化),但我至少想知道其他容器。只是还没有整合,他们就被遗忘了,是因为草稿也没有给他们起名字(为什么?),还是背后有一些特殊的原因?
注意事项:
我知道SO上的这个问题
Why doesn't boost::hash_value support boost::unordered_set by default?
但是我认为这个问题主要是询问一个集合中的一个集合,另外,这个问题已有6年历史(今天可能会得出不同的答案),这就是为什么我要问这个问题。
我也知道在一个完整的容器上构建哈希既不是恒定的访问也不是性能,我们不需要讨论这一点。有时您必须在运行时更改内存消耗(在这种情况下,使用boost :: flyweight,但这需要一个哈希值)。而且,如果类有一个容器作为成员,那么,您就在那儿(如果您不允许更改类本身)。
解决方法
无序的容器将在很大程度上具有不相关的,不可重复的哈希值。
这是因为hash(a,b,c)与hash(b,a,c)或hash(c,a,b)等不同
由于不能依赖顺序并且只能隐式控制顺序,因此您将永远不知道拥有“相同哈希”的含义。查找哈希的主要规则是等效值应哈希为相同的值,但是由于不同集合{a,b,c}作为无序容器可能会哈希为不同值,而等效则将破坏语义。
当然,您可以对集合进行排序,然后对其进行哈希处理,但是这样做的代价似乎太高了-这是默认情况下不提供它的一个很好的理由。
关于为什么将forward_list排除在外,我不太确定。看起来很简单。