c++ - 从映射中删除第一个键值对(在 for 循环中)会导致分段错误
问题描述
我有一个std::map<int, std::string>
,我的目标是根据特定条件删除一个键值对。为简单起见,假设它看起来像这样:
int main(int argc, char const *argv[]) {
std::map<int, std::string> m1;
m1[-2] = "minus two";
m1[-1] = "minus one";
m1[0] = "zero";
m1[3] = "three";
m1[4] = "four";
std::cout << m1.size() << std::endl;
for (auto &&[key, val] : m1) {
std::cout << key << ": " << val << std::endl;
if (key == -2 || key == 3)
m1.erase(key);
}
std::cout << m1.size() << std::endl;
}
一切看起来都很好。但是,它seg fault
在运行时给出:
5
-2: minus two
0:
Segmentation fault (core dumped)
我注意到这只发生在我尝试擦除第一个键值对时,例如在上述情况下:-2: "minus two"
. 如果我尝试擦除任何其他键值对(例如第二个键值对:) ,-1: "minus one"
那么我不会得到seg fault
,例如
std::cout << m1.size() << std::endl;
for (auto &&[key, val] : m1) {
std::cout << key << ": " << val << std::endl;
if (key == -1 || key == 3)
m1.erase(key);
}
std::cout << m1.size() << std::endl;
我还注意到,如果我删除循环外的第一个键值对,for
那么我不会得到seg fault
例如
std::cout << m1.size() << std::endl;
m1.erase(-2);
for (auto &&[key, val] : m1) {
std::cout << key << ": " << val << std::endl;
if (key == -2 || key == 3)
m1.erase(key);
}
std::cout << m1.size() << std::endl;
我注意到的另一件事是,如果只有两个键值对,那么我不会得到seg fault
:
m1[-2] = "minus two";
m1[4] = "four";
std::cout << m1.size() << std::endl;
for (auto &&[key, val] : m1) {
std::cout << key << ": " << val << std::endl;
if (key == -2 || key == 3)
m1.erase(key);
}
std::cout << m1.size() << std::endl;
那么,这是预期的行为吗?如果是,那为什么?另外,在这种情况下,如何删除/擦除for
循环本身中的第一个键值对?for
或者我必须在循环之外删除/擦除它们?
解决方案
推荐阅读
- sql - SQL 存储过程中将用户输入附加到表并防止 sql 注入的正确方法
- javascript - 提供代码后重定向到网页
- windows - 在命令行中键入代码以启动 vscode 时如何避免此 wsh 错误?
- python - Jupyter Notebook 未从 Anaconda Navigator (Linux) 启动
- git - GIT - 将项目内的目录推送到不同的仓库中
- python - “如何将列表中的字符串计算为 - lst=('abcdefgabc')”。输出应该是 a=2, b=2, c=2, d=1, e=1, f=1, g=1
- r - 如何在老鼠期间限制值的插补
- google-cloud-functions - Google Cloud Functions 无法正确加载文件目录
- java - 可以在子类的对象上调用受保护的方法而无需覆盖。为什么 java.lang.Object 中的 clone 方法不同?
- openfaas - 配置 OpenFaas 时出错 - 无法连接到 nats://nats.openfaas.svc.cluster.local:4222