map:Bad Ptr即使找到密钥也是如此

时间:2015-05-27 12:27:07

标签: c++ dictionary

我在struct中有一张地图:

struct amountOfDist
{
        int time;
        vector<int> distVector;
        map<string,int> pairsMap;
};
amountOfDist m_tempDistStruct;

当代码运行时,当我尝试查找值时它会崩溃:

if(m_tempDistStruct.pairsMap.find("(1,2)")->second != 1)
{
       ...
}

我试图通过以下方式隔离命令:

map<string,int>::iterator it;
it = m_tempDistStruct.pairsMap.find("(1,2)");

我得到padptr。但是当我把突破点放在线上时:

it = m_tempDistStruct.pairsMap.find("(1,2)");

我可以看到地图中包含所有键和值(正确的键)和键(1,2)。

为什么find命令会返回badptr

我很乐意提供指导。

感谢。

2 个答案:

答案 0 :(得分:1)

如果地图确实包含您要查找的密钥,那么您的代码应该有效;如果没有其他东西已经出现了可怕的错误。但是,代码相当脆弱,因为如果密钥丢失,它将给出未定义的行为。

在解除引用之前,你必须检查find是否成功;如果它失败了,那么它返回一个不能解除引用的过去的迭代器。或者,使用[],如果缺少新元素,则会插入新元素。

更安全的版本是:

// use find and check it exists
auto found = map.find(key);
if (found != map.end() && found->second != 1)

// use [] to insert if it doesn't exist
if (map[key] != 1)

如果这些都不起作用,或者您完全确定密钥必须存在,那么我们需要查看complete test case以找出问题所在。您还没有向我们展示过的代码。

答案 1 :(得分:0)

使用您的代码,我得到完全正确的行为。因此,我非常确定您所寻找的价值不在map

amountOfDist m_tempDistStruct;

m_tempDistStruct.pairsMap["(1,2)"] = 10;

if  (m_tempDistStruct.pairsMap.find("(1,2)")->second == 10)
{
    cout << "GOT HERE!" << endl;
}

上面的代码段将"(1,2)" => 10添加到地图中,然后发现它就好了。我怀疑地图中的关键字与您的想法略有不同。