hash_map 是 STL 的一部分吗?

Posted

技术标签:

【中文标题】hash_map 是 STL 的一部分吗?【英文标题】:Is hash_map part of the STL? 【发布时间】:2011-08-19 23:56:11 【问题描述】:

快速提问...

【问题讨论】:

没有。使用unordered_map。你真的需要哈希映射吗?如果没有,看看std::map是否符合您的实际要求。 @Martin: hash_map STL 的一部分。 请定义 STL。你的意思是C++标准库吗?还是您指的是多年前发布的原始标准模板库,后来被部分采用为当前的 C++ 标准?通常我们并不关心您是否将 STL 非正式地用作标准库,但在这种情况下它很重要。标准 C++ 没有hash_map,而 STL 有。 (未来的 C++ 和 Boost 有 unordered_map,一个哈希映射。) 【参考方案1】:

The STL 有 hash_map,但 C++ 标准库 does not。

由于a common misconception,您可能会将 C++ 标准库视为“STL”,或将工具链的 C++ 标准库实现的一部分视为“STL 实现”。

不是。

MSVC++ 和 GCC(将 hash_map 实现为特定于编译器的扩展)、place it in the std namespace 也很遗憾,这不仅具有高度误导性,而且根据标准也是非法的。 *叹气*

C++11 引入了std::unordered_map,并没有什么不同。

【讨论】:

【参考方案2】:

引用***(强调):

来自STL 页面:

标准模板库 (STL) 是一个部分包含在 C++ 标准库中的软件库。

...然后从hash_map 页面

在 C++ 编程语言中, hash_map 是散列的名称 标准中的关联容器 模板库。它由提供 几个实现者,例如 GNU C++ 编译器和微软的 Visual C++。 它不是 C++ 的一部分 标准库,但 C++ 技术报告 1 包含非常 类似的容器unordered_map,其中 将包含在即将到来的 C++0x 中 标准。

总之,

是的,它是 STL 的一部分。 但它不是标准库的一部分。 但它得到了几个非常流行的实现的支持。

【讨论】:

@razlebe:你不能只说是或否吗? @forsvarir:当然,但是引用***让我的回答具有一定的可信度。 ;) 重要的是,知道它只是适度便携,如果您仍然选择使用它,那么请检查您的编译器文档以找出它所在的标头和命名空间 - 它可能不是一个简单的 #include <hash_map> / std::hash_map<a, b> x,虽然不会更难...... @forsvarir:这里很难。 OP 的问题必须回答“是”,但 OP 的预期问题应该回答“否”... @Alexandre C.:对不起,温和的工作玩笑(我和 rzelbe 一起工作)......有时很难从他那里得到直接的答案 :)【参考方案3】:

问题是对于术语 STL 的含义没有达成一致。 hash_map 是标准 C++ 的一部分吗?不,不是。不过,unordered_map 将成为新 C++ 标准的一部分,并且是使用散列实现的映射。

【讨论】:

如果您对 STL 的定义包括一些现成的实现,那么它可能包括 hash_map 这里一个约定俗成的意思。只是有些人不认同而已。 @Tomalak 如果有人不同意,那就不同意。 @James:请返回并再次阅读我的评论,就像它被一个巨大的笑脸包围一样。【参考方案4】:

是的hash_map 是 STL 的一部分。但是,它不是 C++03 标准库的一部分。

【讨论】:

真的吗?我在 C++0x FDIS 中找不到 hash_map。您有任何证据支持您的主张吗? @FredOverflow:尽管您有误解,但只有一个 STL @JamesKanze:我根据技术和历史准确性决定了这个词的含义,你按照托马拉克的话来跟我走。这种愉快的反应是因为你更喜欢正确的意思。 @Tomalak 你(或任何其他人)可以决定一个词的含义;意义是由共识确定的。如果只有你和我一起讨论,我们会有共识——我认识的其他几个人也同意这一点(例如 Bjarne Stroustrup)。在这样一个开放的论坛中,我们必须考虑到整个社区的共识,遗憾的是,在 STL 的情况下,没有一个,所以我们必须更加明确为了确保被理解。 @JamesKanze:我已经决定这个词的意思应该反映这个词的意思。我已经决定无论如何每个人都将遵循这一点。它将在下次有机会时写入法律。感谢您的参与。【参考方案5】:

hash_map 是 STL 的一部分,但不是标准 C++(C++11) 的一部分。在标准 C++ 中有一个类似的 hash_map 实现,名为“std::unordered_map”: http://www.cplusplus.com/reference/unordered_map/unordered_map/

目前,GNU C++ 和 MSVC++ 已经实现了 hash_map 用于编译器扩展,以及 Boost。同时,SGI 有自己的 hash_map 实现。详情可以参考http://www.sgi.com/tech/stl/hash_map.html

【讨论】:

【参考方案6】:

不...Hash_map 不是 STL 标准的一部分。

【讨论】:

没有 STL 标准这样的东西。 @AlexandreC.:没有来自 ISO、ANSI 等的 STL 标准,但没有理由不将 STL 文档(例如在 sgi.com)视为其事实上的标准。跨度> @Alexandre C:或者说有几个,取决于你对STL的定义。

以上是关于hash_map 是 STL 的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

详解STL中的map和hash_map区别

STL 之 hash_map源代码剖析

stl之hash_map

使用 hash_map 时在 stl 字符串上使用的最佳散列算法是啥?

使用 hash_map 时在 stl 字符串上使用的最佳散列算法是啥?

C++ 中的 map 与 hash_map