我有一个 _bstr_t 键类型的无序映射。因此,由于哈希函数默认不支持这种键类型,所以我定义了仿函数:
struct KeyHash {
size_t operator()(const _bstr_t& key) const {
return hash<LPCTSTR>()(key);
}
};
接下来我定义了typedef:
typedef unordered_map<_bstr_t, RecentInfo*, KeyHash> RecentInfoMap;
并且出现了问题:如果我使用默认构造函数实例化RecentInfoMap
RecentMapInfo rim;
然后一切正常。但是,如果我想用初始桶数实例化 RecentInfoMap
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;
一切正常:map[t1] 和 map[t2] 引用一个值 555。但是如果 map 定义为
unordered_map<bstr_t, int, KeyHash> map(100);
然后出现错误:map 包含重复的键和 map[t1] 对 777 的引用和 map[t2] 对 555 的引用。
该语句(使用 rehash 调用)也给出了重复的键:
unordered_map<bstr_t, int, KeyHash> map;
map.rehash(100);