Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有自定义哈希函数(_bstr_t)的无序映射仅适用于默认构造函数(重复键)_C++_Visual Studio 2010_C++11_Unordered Map - Fatal编程技术网

C++ 带有自定义哈希函数(_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); 那地图就不起作用了。我无法

我有一个无序的地图,带有一个_bstr\t键类型。因此,由于哈希函数默认不支持此键类型,因此我定义了函子:

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;