哈希表是STL的一部分吗?

64

简单问题...hash_map 是 STL 的一部分吗?


2
不要使用 unordered_map。你真的需要一个哈希表吗?如果不是,看看 std::map 是否符合你的实际需求。 - Martin York
6
@Martin:hash_map是STL的一部分。 - Alexandre C.
11
请定义STL。你是指C++标准库吗?还是指许多年前发布的原始标准模板库,后来被部分采纳为当前的C++标准?通常情况下,我们并不在意您是否非正式地使用STL来表示stdlib,但在这种情况下很重要。标准C ++没有hash_map,STL有。 (未来的C++和Boost有unordered_map,即哈希映射。) - GManNickG
6个回答

112

STLhash_map,但是C++标准库没有

由于一个常见的误解, 你可能会认为C++标准库是"STL",或者你工具链中实现的C++标准库的某些部分是"STL实现"。

它不是。

同时,令人遗憾的是,MSVC++和GCC(将hash_map实现为编译器特定扩展)将其放置在std命名空间中,这不仅极具误导性,而且违反了标准。*叹气*

C++11引入了std::unordered_map,它与hash_map有异曲同工之妙。


19

引用维基百科(重点加粗):

STL页面:

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

...然后从哈希映射页面

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

简而言之:

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

3
@razlebe: 你不能直接回答是或不是吗? - forsvarir
7
当然,但引用维基百科可以增加我的回答的可信度。 ;) - razlebe
重要的是,需要知道它只是适度可移植的。如果您选择使用它,请务必检查编译器文档以找出它所在的头文件和命名空间 - 它可能不是一个简单的 #include <hash_map> / std::hash_map<a, b> x,但也不会更难... - Tony Delroy
4
很遗憾,我只能用英文进行回答。以下是您需要翻译的内容:@forsvarir:这里很棘手。回答者必须回答“是”才能回答OP的问题,但OP实际想问的问题应该回答“否”…… - Alexandre C.
@Alexandre C.:抱歉,只是一些轻松的工作调侃(我和 razelbe 一起工作)...有时候从他那里得到一个直截了当的答案可能会有些困难 :) - forsvarir
显示剩余8条评论

8
问题在于,“STL”这个术语没有达成一致的含义。那么 hash_map 是否是标准 C++ 的一部分呢?答案是否定的。然而,unordered_map 将会成为新版 C++ 标准的一部分,并且是一个使用哈希实现的映射表。

1
如果您的STL定义包括一些现成的实现,则可能包括hash_map - James Kanze
4
有一个达成共识的意义,只是有些人不同意它。 - Lightness Races in Orbit
@Tomalak 如果有人不同意,那么就没有达成共识。 - James Kanze
6
@James:请再回去读一遍我的评论,就好像它被巨大的笑脸包围着。 - Lightness Races in Orbit

5

是的hash_mapSTL 的一部分。然而,它 不是 C++03 标准库的一部分。


4
尽管你有误解,但事实上只有一个STL。 - Lightness Races in Orbit
@Tomalak Geret'kal:词语的意义是由用户间的共识所决定。遗憾的是,在STL的情况下,并没有真正的共识,我们必须考虑到它有几个不同的含义,这取决于谁在使用它。(我更喜欢使用STL指代在http://www.sgi.com/tech/stl/上定义的库,其中包括`hash_map`。但并不是每个人都以这种方式使用这个词,因此除非你知道作者的意思,否则你必须询问他们对它的理解。) - James Kanze
1
@JamesKanze:我已经根据技术和历史的准确性决定了这个词的含义,你应该按照Tomalak的话跟随我。这个欢快的回应是因为你仍然喜欢正确的含义。 - Lightness Races in Orbit
4
@Tomalak,你(也不能有其他任何一个人)可以决定一个词的意思;意义是通过共识建立的。如果只是你和我一起讨论事情,我们就有了一个共识——我知道还有另外几个人同意它(例如Bjarne Stroustrup)。在像这样的开放论坛中,我们必须考虑整个社区的共识,遗憾的是,在STL的情况下,我们没有共识,因此我们必须更加明确才能确保被理解。 - James Kanze
1
@JamesKanze:我已经决定,一个词的含义应该反映出这个词的意思。我决定无论如何每个人都会遵循这一点。在下一个可用的机会,它将被写入法律中。感谢你的参与。 - Lightness Races in Orbit
显示剩余3条评论

2

-1

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


6
并没有STL标准这样的东西。 - Alexandre C.
2
@AlexandreC.:ISO、ANSI等没有STL标准,但是我们可以把STL文档(例如sgi.com上的文档)视为事实上的标准。 - Fred Nurk
@Alexandre C:或者说根据您对STL的定义,有几种不同的方案。 - James Kanze

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