使用地图C ++输出错误

时间:2015-05-07 12:30:01

标签: c++ c++11

我编写了以下代码来构造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";
}

5 个答案:

答案 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)

  1. 你可能有文字的拼写错误 - 只需key = make_pair(...u,...u)
  2. 您的哈希函子可能有溢出 - unsigned int在您的系统上可能是32位。)
  3. 您的文字可能超过有符号整数的最大值,并且未指定为无符号。

答案 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(),因此你的循环是无限的,直到你得到一个段错误,因为你已经访问了不属于你的内存。