c++ - 即使键相等,hash_map 也会保存每个键/值对

标签 c++ hashmap key-value

大家好,我正在使用 hash_map 将字符串相互关联,代码如下:

#include <string>
#include <iostream>
#include <hash_map>

using namespace std;
using namespace stdext;

struct StrCompare : public stdext::hash_compare<string> {
 unsigned int operator()(const string str) const {
  unsigned int hash = 0;
  unsigned int len = str.length();

  for (unsigned int i = 0; i < len; i++)
   hash = 31 * hash + str[i];

  return hash;
 }

 bool operator()(const string str1, const string str2) const {
  return str1 == str2;
 }
};

int main() {
 hash_map<string, string, StrCompare> m;

 m["asdf"] = "fe";
 m["asdf"] = "asdf";

 for (hash_map<string, string, StrCompare>::iterator i = m.begin(); i != m.end(); ++i)
  cout << i->first << " " << i->second << endl;

 system("PAUSE");
}

问题是输出是:

asdf asdf
asdf fe
Press any key to continue . . .

为什么会这样?我每次都尝试打印哈希值,但哈希值是一样的。

最佳答案

hash_map 没有进入 C++0x 的原因之一是存在许多相互冲突的实现,而且几乎没有可靠的规范。

我会改用 C++0x 接受的内容。 std::unordered_map 可能有一个长而笨拙的名字,但语义定义明确;它不会存储重复的键(为此,您将使用 std::unordered_multimap 代替)。

关于c++ - 即使键相等,hash_map 也会保存每个键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4201383/

相关文章:

c++ - 是否可以修复可变参数模板函数的参数?

android - 如何访问(迭代?)另一个类中的 ArrayList/Hashmap?

java - 如何在 Java 中创建自己的 HashMap?

python - 比较给定给python中的键的多个值

具有自定义步骤的循环的 C++ 范围

c++ - 使用默认值而不是异常来 boost numeric_cast<>?

c++ - 在OpenGL中实现VBO,窗口保持黑色

Java - 数百万条记录,HashMap 抛出 OutOfMemoryError

Kotlin 将 List<Pair<K, Collection<V>>> 转换为 Multimap

javascript - 从json中的动态键值获取数据