地图:坏Ptr,即使找到了钥匙
map: Bad Ptr even if the key was found
我有一个映射内部结构:
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)");
我可以看到map包含了所有的键和值(正确的键和值),并且键(1,2)存在。
为什么find
命令返回badptr
?
我很乐意得到指导。
谢谢。
如果映射确实包含你正在寻找的键,那么你的代码应该工作;如果没有,那一定是别的什么地方出了可怕的问题。然而,代码是相当脆弱的,因为它会给出未定义的行为,如果缺少密钥。
解除引用前必须检查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)
如果这两种方法都不起作用,或者您绝对确定键必须存在,那么我们需要查看一个完整的测试用例,以找出您没有向我们展示的代码出了什么问题。
使用你的代码,我得到了完全正确的行为。所以我很确定你要找的值不在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
添加到映射中,然后发现它很好。我怀疑你地图上的键和你想的有微妙的不同
相关文章:
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 我只是在寻找模板,在我的书中找到了这段代码,这显示了隔离错误?
- Cmake忽略了我所有关于在boost::beast存储库中在哪里找到提升的指令
- 如何找到Espeak是否结束了演讲
- CMake 找到了 Boost,但没有请求库
- 给定长度不同的序列找到了它们每个人共有的最大数字序列
- 我怎么知道,如果我在 STL 列表中找到了我搜索的号码
- CMake 找到了 Boost,但 Make 找不到包含文件
- Cmake找到了通往OpenCV库的路径,但没有找到OpenCV函数Rodrigues
- 优雅的方式找到了立方体的顶点
- 我无法理解方程式的解决方案,该方程式说找到了最小的数字,因此x plus y等于x bitwise或y
- 程序在第一次运行时正确地找到了最大值和最小值,但如果我再次运行,它会给我错误的答案
- C ++找到了一个关于拆分字符串的示例,试图弄清楚为什么更改它会改变结果
- 安全布尔成语 - 我是否找到了更简单的方法,还是我错过了什么
- 从网络豆到VS的转变。NB没有错误。VS找到了一些,我无法修复它们
- 找不到-ljson11的库,但找到了-lsxlite 3
- 在Rotary Encoder中找到了cli()调用
- 没有未定义的引用,尽管找到了库并导出了符号
- CMake找到了boost库,但是不能链接它们
- 地图:坏Ptr,即使找到了钥匙