我想在 C++ 中查看 hash_map 示例
Posted
技术标签:
【中文标题】我想在 C++ 中查看 hash_map 示例【英文标题】:I would like to see a hash_map example in C++ 【发布时间】:2011-01-11 21:42:12 【问题描述】:我不知道如何在 C++ 中使用哈希函数,但我知道我们可以使用 hash_map
。 g++ 是否通过简单地包含#include <hash_map>
来支持它?使用hash_map
的简单示例是什么?
【问题讨论】:
@BlueRaja:是的,确实,使用它会导致人们认为hash_map
实际上是C++ 的一部分。我认为这就像任何其他与编程相关的问题一样,就在家里,不是吗?告诉人们使用 Google 是在浪费他们和我们的时间。他们是因为他们必须筛选成千上万个不准确和不可靠的答案,而我们是因为当他们稍后来这里提问时,我们必须消除他们所有的误解和不良做法。
@jalf:好像关于 SO 的答案在某种程度上保证是准确和可靠的。
保证他们会被其他程序员看到并投票给他们,这使得他们比大多数初学者在谷歌上盲目搜索的内容更值得信赖。
【参考方案1】:
***从不让人失望:
http://en.wikipedia.org/wiki/Hash_map_(C%2B%2B)
【讨论】:
【参考方案2】:hash_map 是一个非标准的扩展。 unordered_map 是 std::tr1 的一部分,将被移动到 C++0x 的 std 命名空间中。 http://en.wikipedia.org/wiki/Unordered_map_%28C%2B%2B%29
【讨论】:
【参考方案3】:当前的 C++ 标准没有哈希映射,但即将到来的 C++0x 标准有,并且这些已经被 g++ 以“无序映射”的形式支持:
#include <unordered_map>
#include <iostream>
#include <string>
using namespace std;
int main()
unordered_map <string, int> m;
m["foo"] = 42;
cout << m["foo"] << endl;
为了得到这个编译,你需要告诉g++你正在使用C++0x:
g++ -std=c++0x main.cpp
这些映射的工作原理与 std::map 非常相似,除了您不需要为您自己的类型提供自定义 operator<()
之外,您需要提供自定义哈希函数 - 为整数和字符串等类型提供了合适的函数。
【讨论】:
@Kornel 不,我不应该。 TR1 从未被批准 - tr1 命名空间只是一些编译器提供的扩展。我从不在自己的代码中使用它。 @Neil,sooo,使用 GCC 3.4、MSVC 和其他非 C++0x 编译器的人不应该使用 TR1,但请等到开箱即用地支持 C++0x 库扩展? @Kornel 他们当然可以使用 TR1,但我不使用 VC++,所以良心上不能编辑我的答案以建议他们这样做。为了真正安全,这是我的大部分代码所做的,不要使用无序映射。这取决于您希望代码的可移植性。 @Neil,嗯,点了,但是在这种情况下,指向被添加到 C++0x 标准工作草案中的 Boost.Unordered 是否可以接受? Std 现在有一个map
数据结构。【参考方案4】:
#include <tr1/unordered_map>
将为您提供下一个标准 C++ unique hash container。用法:
std::tr1::unordered_map<std::string,int> my_map;
my_map["answer"] = 42;
printf( "The answer to life and everything is: %d\n", my_map["answer"] );
【讨论】:
带有 C++ 风格容器的 C 风格输出?哎哟! 欢迎来到现实世界:)【参考方案5】:TR1(以及下一个标准的草案)接受的名称是 std::unordered_map
,所以如果您有这个名称,它可能就是您想要使用的名称。
除此之外,使用它很像使用std::map
,附带条件是当/如果您遍历std::map
中的项目时,它们会按照operator<
指定的顺序出现,但是对于unordered_map,顺序一般没有意义。
【讨论】:
以上是关于我想在 C++ 中查看 hash_map 示例的主要内容,如果未能解决你的问题,请参考以下文章