我在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
?
我很乐意提供指导。
感谢。
答案 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
添加到地图中,然后发现它就好了。我怀疑地图中的关键字与您的想法略有不同。