std :: hash_set vs std :: unordered_set,它们是一样的吗?

时间:2011-10-01 22:19:31

标签: c++ optimization stl hash hashset

我知道hash_set是非标准的,unordered_set是标准的。但是,我很纳闷,表现明智,这两者有什么区别?为什么它们分开存在?

4 个答案:

答案 0 :(得分:22)

C ++标准规定的unordered_容器的复杂性要求基本上没有为实现留下太多空间,实现必须是某种哈希表。该标准的编写充分意识到大多数供应商已将这些数据结构作为扩展部署。

编译器供应商通常会将这些容器称为“哈希映射”或“哈希集”,这可能是您所指的(标准中没有文字std::hash_set,但我认为GCC中有一个在一个单独的命名空间中,类似于其他编译器。)

当编写新标准时,作者希望避免可能与现有扩展库混淆,因此他们寻找反映典型C ++思维模式的名称:说明它是什么,而不是如何实现。无序容器是无序的。这意味着与订购的容器相比,您可以从中获得更少的收益,但这种减少的实用程序可以为您提供更高效的访问。

实现方式,hash_set,Boost-unordered,TR1-unordered和C ++ 11-unordered将非常相似,如果不相同的话。

答案 1 :(得分:3)

关于问题"他们是相同的事情"来自主题:基于我将代码从__gnu_cxx :: hash_set升级到std :: unordered_set的经验,它们几乎(但不完全相同)是相同的。

我遇到的不同之处在于迭代__gnu_cxx :: hash_set会返回看似原始插入顺序的项目,而std :: unordered_set则不会。顾名思义,当迭代整个std :: unordered_set时,不能依赖迭代器以任何特定顺序返回项目。

答案 2 :(得分:2)

Visual Studio 2010例如同时具有hash_xxxunordered_xxx,如果您查看标题,至少它们的实现对于所有这些(相同的基础 - /“策略”类)是相同的)。 对于其他编译器,我不知道,但由于哈希容器通常必须实现,我想不会有很多差异,如果有的话。

答案 3 :(得分:1)

它们几乎是一样的东西。标准(C ++ 0x)名称是unordered_set。 hash_set是boost和其他人的早期名称。