我编写了以下代码来构造std :: pair作为unordered_map的关键。但是,我不知道为什么我得到全0作为向量的输出。有人可以建议我哪里出错了吗?
struct key_hash
{
size_t operator()(const std::pair<unsigned,unsigned>& key) const
{
return uint64_t((key.first << 32) | key.second);
}
};
typedef std::unordered_map<std::pair<unsigned,unsigned>, std::vector<unsigned>, key_hash> MyMap;
int main()
{
MyMap m;
vector<unsigned> t;
t.push_back(4);
t.push_back(5);
m[make_pair(4294967292,4294967291)]=t;
for(vector<unsigned>::iterator i=m[make_pair(4294967292,4294967291)].begin(),j=m[make_pair(2147483645,2147483643)].end();i!=j;++i)
cout<<"vec="<<(*i)<<"\n";
cout<<"vector empty. \n";
}
答案 0 :(得分:4)
i 和 j 是2个不同向量的迭代器,无法进行比较。使用调试迭代器可能会在visual studio下捕获它。
此代码:j=m[make_pair(2147483645,2147483643)].end();
将创建一个新的空向量,因为该密钥与之前使用的密钥不同。
这样初始化 j :j=m[make_pair(4294967292,4294967291)].end();
结果很好:
vec=4
vec=5
vector empty.
答案 1 :(得分:3)
您正在获得未定义的行为,因为m[make_pair(4294967292,4294967291)]
和m[make_pair(2147483645,2147483643)]
可能是不同的对象(除非发生溢出包装的一些非常奇怪的事情)。
答案 2 :(得分:3)
key = make_pair(...u,...u)
。unsigned int
在您的系统上可能是32位。)答案 3 :(得分:2)
尝试将哈希函数更改为以下行:
struct key_hash
{
size_t operator()(const std::pair<unsigned,unsigned>& key) const
{
uint64_t tmp = key.first;
tmp = tmp << 32;
return uint64_t(tmp | key.second);
}
};
我还添加了该对的一个实例,因此将main更改为:
MyMap m;
vector<unsigned> t;
t.push_back(4);
t.push_back(5);
auto a = make_pair(4294967292,4294967291);
m[a]=t;
for(vector<unsigned>::iterator i=m[a].begin(),j=m[a].end();i!=j;++i)
cout<<"vec="<<(*i)<<"\n";
cout<<"vector empty. \n";
这给了我正确的输出:
vec=4
vec=5
vector empty.
答案 4 :(得分:2)
整理循环以使其清晰(并忽略关于32位值上32位左移的警告......)
你在做什么是这样的:
FOR DELETE
增加一个向量的迭代器永远不会产生另一个向量的end(),因此你的循环是无限的,直到你得到一个段错误,因为你已经访问了不属于你的内存。