C++ 带有自定义哈希函数(_bstr_t)的无序映射仅适用于默认构造函数(重复键)
我有一个无序的地图,带有一个_bstr\t键类型。因此,由于哈希函数默认不支持此键类型,因此我定义了函子:C++ 带有自定义哈希函数(_bstr_t)的无序映射仅适用于默认构造函数(重复键),c++,visual-studio-2010,c++11,unordered-map,C++,Visual Studio 2010,C++11,Unordered Map,我有一个无序的地图,带有一个_bstr\t键类型。因此,由于哈希函数默认不支持此键类型,因此我定义了函子: struct KeyHash { size_t operator()(const _bstr_t& key) const { return hash<LPCTSTR>()(key); } }; 那一切都很好。但是如果我想用初始桶数实例化RecentInfo映射 RecentInfoMap rim(100); 那地图就不起作用了。我无法
struct KeyHash {
size_t operator()(const _bstr_t& key) const {
return hash<LPCTSTR>()(key);
}
};
那一切都很好。但是如果我想用初始桶数实例化RecentInfo映射
RecentInfoMap rim(100);
那地图就不起作用了。我无法通过它的键获取值。另外,如果我在使用地图之前调用rim.rehash(100),那么也不起作用
请解释我做错了什么
更新:一些代码示例:
unordered_map<bstr_t, int, KeyHash> map;
_bstr_t t1("ORCL");
_bstr_t t2("ORCL");
map[t1] = 777;
map[t2] = 555;
fout << map[t1] << endl;
fout << map[t2] << endl;
无序地图;
_bstr_t t1(“ORCL”);
_bstr_t t2(“ORCL”);
map[t1]=777;
map[t2]=555;
在之前,您可能需要再次检查返回的KeyHash()(t1)
和KeyHash()(t2)
这可能是因为你非常(不)幸运,它在第一种情况下完全有效。虽然这有点像是瞎猜,因为我对这些windows数据类型了解不多。我找到了解决方案。刚刚编写了我自己的自定义哈希函数,可以使用char*(wchar\u t*)指针。还添加了相等函子。对我来说很好。希望它对某人有用
struct KeyHash {
size_t operator()(const _bstr_t& key) const {
LPCTSTR str = key;
LPCTSTR end = str + _tcslen(str);
size_t hash = 2166136261U;
while (str != end) {
hash = 16777619U * hash ^ static_cast<size_t>(*str++);
}
return hash;
}
};
struct KeyEquals {
bool operator()(const _bstr_t& x, const _bstr_t& y) const {
return _tcscmp(x, y) == 0;
}
};
typedef unordered_map<_bstr_t, RecentInfo*, KeyHash, KeyEquals> RecentInfoMap;
struct-KeyHash{
size\u t运算符(){
LPCTSTR=密钥;
LPCTSTR-end=str+_-tcslen(str);
大小\u t散列=2166136261U;
while(str!=结束){
散列=16777619U*散列^static_cast(*str++);
}
返回散列;
}
};
结构键等于{
布尔运算符(){
返回_tcscmp(x,y)==0;
}
};
typedef无序地图近景地图;
您得到的实际错误是什么?如果没有默认的构造函数映射,请不要按其键返回值。好像键值对不在映射中。发布一些显示实际输出与预期输出问题的代码。我在主题中添加了一些代码示例。几分钟前我检查了一下,你是对的-KeyHash为t1和t2返回不同的哈希结果。我仍然不知道为什么。@EldarAgalarov,因为VS2010不提供特殊的char*
hash,而只提供标准的hash
部分专门化。然后它在内部使用指针值的整数散列(而不散列字符串本身)——这符合标准。
unordered_map<bstr_t, int, KeyHash> map;
_bstr_t t1("ORCL");
_bstr_t t2("ORCL");
map[t1] = 777;
map[t2] = 555;
fout << map[t1] << endl;
fout << map[t2] << endl;
unordered_map<bstr_t, int, KeyHash> map(100);
unordered_map<bstr_t, int, KeyHash> map;
map.rehash(100);
struct KeyHash {
size_t operator()(const _bstr_t& key) const {
LPCTSTR str = key;
LPCTSTR end = str + _tcslen(str);
size_t hash = 2166136261U;
while (str != end) {
hash = 16777619U * hash ^ static_cast<size_t>(*str++);
}
return hash;
}
};
struct KeyEquals {
bool operator()(const _bstr_t& x, const _bstr_t& y) const {
return _tcscmp(x, y) == 0;
}
};
typedef unordered_map<_bstr_t, RecentInfo*, KeyHash, KeyEquals> RecentInfoMap;