大家好,我正在使用 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/