在下面的代码中,我遍历一个map并测试是否需要擦除一个元素 . 擦除元素并继续迭代是否安全,或者我是否需要在另一个容器中收集密钥并执行第二次循环来调用erase()?
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it;
for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it++)
{
if (pm_it->second == delete_this_id) {
port_map.erase(pm_it->first);
}
}
更新:当然,我认为我认为不会相关,但我回答了我的问题 .
3 回答
这就是我这样做的方式......
我就是这样做的,约:
有一些奇怪的事情
但我只是从你的示例代码中复制它 .
C 11
这已在C 11中修复(或擦除已在所有容器类型中得到改进/一致) .
擦除方法现在返回下一个迭代器 .
C 03
擦除映射中的元素不会使任何迭代器无效 .
(除了被删除的元素上的迭代器)
实际插入或删除不会使任何迭代器失效:
另见这个答案:
Mark Ransom Technique
但您确实需要更新代码:
在你的代码中,你在调用erase后递增pm_it . 此时为时已晚,已经失效 .