【问题标题】:I would like to see a hash_map example in C++我想在 C++ 中查看 hash_map 示例
【发布时间】:2011-01-11 21:42:12
【问题描述】:

我不知道如何在 C++ 中使用哈希函数,但我知道我们可以使用 hash_map。 g++ 是否通过简单地包含#include <hash_map> 来支持它?使用hash_map 的简单示例是什么?

【问题讨论】:

  • @BlueRaja:是的,确实,使用它会导致人们认为hash_map 实际上是C++ 的一部分。我认为这就像任何其他与编程相关的问题一样,就在家里,不是吗?告诉人们使用 Google 是在浪费他们和我们的时间。他们是因为他们必须筛选成千上万个不准确和不可靠的答案,而我们是因为当他们稍后来这里提问时,我们必须消除他们所有的误解和不良做法。
  • @jalf:好像关于 SO 的答案在某种程度上保证是准确和可靠的。
  • 保证他们会被其他程序员看到并投票给他们,这使得他们比大多数初学者在谷歌上盲目搜索的内容更值得信赖。

标签: c++ hashmap


【解决方案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&lt;() 之外,您需要提供自定义哈希函数 - 为整数和字符串等类型提供了合适的函数。

      【讨论】:

      • @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 &lt;tr1/unordered_map&gt; 将为您提供下一个标准 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&lt; 指定的顺序出现,但是对于unordered_map,顺序一般没有意义。

      【讨论】:

        猜你喜欢
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 2016-06-26
        • 2016-02-14
        • 1970-01-01
        相关资源
        最近更新 更多