c++ - 在 C++ 映射上使用迭代器擦除
问题描述
我遇到了以下行为:我创建了一个地图,在键上进行查找并删除了地图条目。擦除后,我使用迭代器打印元素,我希望它能够转储核心,但它可以工作。
为什么它有效?
typedef std::pair<std::string, int> pair;
std::map<pair, int> nameidCntMap;
pair pair1("ABC", 139812);
pair pair2("XYZ", 139915);
pair pair3("PQR", 139098);
nameidCntMap.insert(std::make_pair(pair1, 1));
nameidCntMap.insert(std::make_pair(pair2, 1));
nameidCntMap.insert(std::make_pair(pair3, 1));
std::map<pair, int>::iterator it = nameidCntMap.find(pair1);
if (it != nameidCntMap.end())
{
symsrcidCntMap.erase(it);
std::cout<<"Pair::first: "<<it->first.first << "Pair::second: "<<it->first.second<<"map second:"<<it->second<<std::endl;
}
解决方案
为什么它有效?
它不“工作”。
程序的行为未定义。
预计它会转储核心
你的期望是错误的。当您间接通过无效的迭代器时,该程序未定义为“转储核心”。没有为此类程序定义任何行为。因此,任何行为都是可能的。在所有可能的行为中,这种行为有可能是您没有预料到的,或者您认为是“工作”的行为。
推荐阅读
- javascript - 我是否正确使用样式组件?
- swift - 将 JSON 推送到本地领域的正确类结构
- php - 通过php发送邮件时,我不断收到主机错误
- javascript - 在视图 MVC 5 中显示 1000 逗号分隔符
- arrays - 尝试读取带有前导空格的字符串时需要帮助解决“下标超出范围”错误
- python - 使用 Amazon Glue 将行转换为列
- javascript - 我有一个用户信息命令,并使用 .createdAt 创建了日期。我不能像以前那样对它进行风格化
- python - 使用来自虚拟列的文本字符串创建数据框列
- java - 在单击时添加 GUI 元素仅适用一次
- python - 如何将拆分的文本保存到excel文件中?