在 C 中迭代映射时,必须考虑以下含义:在循环内对地图元素调用擦除()方法。具体来说,出现了这样的问题:擦除元素并继续迭代是否安全,或者是否有必要将密钥收集到另一个容器中并执行单独的循环进行擦除?
在 C 03 中,从 a 中擦除元素map 不会使任何迭代器 失效,除了 那些指向已删除元素的迭代器。但是,请务必注意,您的代码在调用擦除后正在修改迭代器。这是有问题的,因为一旦调用擦除,pm_it 就会变得无效。为了解决这个问题,您应该在调用擦除之前增加迭代器。
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { port_map.erase(pm_it++); // Use iterator and post-increment } else { ++pm_it; // Can use pre-increment here for efficiency } }
在C 11中,对擦除进行了重大改进,因为它现在返回下一个迭代器。这消除了对上面所示的尴尬的后增量技术的需要。相反,您可以写:
auto pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { pm_it = port_map.erase(pm_it); } else { ++pm_it; } }
以上是在迭代期间对 C 映射元素调用'erase()”是否安全?的详细内容。更多信息请关注PHP中文网其他相关文章!