我有这样的代码。我用
pvalueholder是多态的类,它可以包含所有类型的字符串..字符串.. 它也可以有一个未定义的类型。
typedef hash_map<pvalueholder,pvalueholder,pvaluehasher > hashtype;
hashtype h;
pvalueholder v;
v="c";
h[v]=5; // h has one element
pvalueholder v2=h[v]; // here h gets a new key/value how is that possible?
cout << (string) (h[v]) << endl; // here h gets another new key/value how is that possible?
int i =0;
for (hashtype::iterator h1=h.begin(); h1!=h.end();h1++)
{
cout << "no: " << i++ << endl;
} // this prints three lines, it should print one...
这里有两个值未定义,第三个值是预期的5。
size_t pvaluehasher::operator() (const pvalueholder& p) const
{
cout << "hashvalue:" << p.value->hashvalue() << endl;
return p.value->hashvalue();
}
返回 这是印刷的内容: 散列值:84696444 散列值:84696444 散列值:84696444 回报:1 散列值:84696444 回报:1 散列值:84696444 回报:1 回报:1 散列值:84696444
你有什么想法吗? 谢谢。
解决方案: 在Microsoft STL的情况下,函数operator()(parameter1,parameter2)需要不同。 对于microsoft,它需要返回少于parameter1和parameter2之间的关系。 对于gcc,它需要返回相等性。我恢复了平等。 键的比较功能不正确...... 该函数返回true表示相等,但必须返回的时间小于Microsoft STL。
答案 0 :(得分:2)
我的猜测是你的哈希函数不正确 - 这意味着它给出相同的键"c"
会产生不同的哈希值。
显示pvalueholder
的声明和pvaluehasher
的完整代码。
答案 1 :(得分:2)
几乎不可能对hash_map
发表评论,因为它从未被标准化,现有的实现并不完全一致。更糟糕的是,您的代码似乎不正确或可编译 - 有些地方与键相关的值似乎是一个int,而其他地方则是一个字符串。
使用std::tr1::unordered_map
并修复其余代码进行编译并且看似合理,如下所示:
#include <unordered_map>
#include <iostream>
#include <string>
using namespace std;
typedef std::tr1::unordered_map<std::string, int> hashtype;
std::ostream &operator<<(std::ostream &os, std::pair<std::string, int> const &d) {
return os << d.first << ": " << d.second;
}
int main() {
hashtype h;
std::string v = "c";
h[v]=5; // h has one element
int v2=h[v];
cout << h[v] << endl;
int i =0;
for (hashtype::iterator h1=h.begin(); h1!=h.end();h1++)
{
cout << *h1 << endl;
} // this prints three lines, it should print one...
return 0;
}
我得到的输出是:
5
c: 5
这似乎很合理 - 我们只按预期插入了一个项目。
答案 2 :(得分:0)
解决方案:在Microsoft STL的情况下,函数operator()(parameter1,parameter2)需要不同。对于microsoft,它需要返回少于parameter1和parameter2之间的关系。对于gcc,它需要返回相等性。我恢复了平等。键的比较函数不正确...函数返回true表示相等,而且必须返回少于Microsoft STL的函数。