哈希表和无序映射之间有什么区别?

51

我最近发现C++中哈希映射的实现将被称为unordered_map

当我查找为什么他们不只使用hash_map时,我发现显然存在与hash_map实现相关的兼容性问题,而unordered_map解决了这些问题(更多信息请参见此处)。

该维基页面没有提供更多信息,因此我想知道是否有人了解hash_map存在哪些问题,而unordered_map可以解决。

1个回答

82

由于C++标准库中没有定义哈希表,因此标准库的不同实现者会提供非标准的哈希表,通常称为hash_map。 由于这些实现是不遵循标准的编写的,它们在功能和性能保证方面都存在微妙的差异。

C++11开始,C++标准库增加了哈希表实现。为了避免与这些非标准实现发生冲突,并防止开发人员在代码中意外使用新类,决定为该类使用替代名称。

所选用的替代名称是unordered_map,实际上更具描述性,因为它暗示了该类的映射接口和其元素的无序性。


5
这表明std命名空间没有完全实现他们所希望的,这是其中一件事情。不过我不知道什么能够合理地防止这个问题的发生。 - Michael Burr
MSVC为其标准扩展库提供了stdext。 - Puppy
9
@MichaelBurr 在这里namespace std失败了吗?非标准的 hash_map 并没有在该命名空间中(至少在法律上是如此),所以我不太理解 @Stef 所说的话。有这方面的来源吗? - rubenvb
3
根据C++标准委员会文件:“由于多个供应商在命名空间 std 中定义了具有 hash_* 名称的类,因此定义一个带有该名称的标准类将引入一个令人讨厌的向后兼容性问题。” - pera
虽然作为更接口级别的名称是有意义的,但它仍需要您为键类型拥有一个std::hash函数。 unordered_map给人一种错觉,认为您可以只需投入任何自定义类型而无需执行其他操作。 - Jimmy T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接