迭代期间擦除映射元素时的潜在陷阱
在 C 中操作映射时,考虑迭代时擦除元素的后果至关重要他们。本问题探讨了 C 03 和 C 11 的潜在问题并提供了解决方案。
C 03 注意事项
在 C 03 中,从映射中删除元素并不自动使映射中的所有迭代器失效。但是,它确实使指向已删除元素的迭代器无效。要安全地迭代映射并在迭代期间擦除元素,您需要在调用擦除之前递增迭代器。以下是问题中提供的代码的更新版本:
map<string, SerialdMsg::SerialFunction_t><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 post-increment to get the updated iterator. } else { ++pm_it; // Can use pre-increment for efficiency. } }
C 11 增强
在 C 11 中,erase() 方法得到了显着改进。现在,它返回一个指向映射中下一个元素的迭代器,从而可以在迭代期间安全地删除元素,而不会导致其他迭代器无效。使用 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; } }
Mark Ransom 技术
Mark Ransom 技术是 C 03 中用于在迭代期间安全擦除地图元素的另一个选项。它涉及创建一个临时向量来存储要擦除的元素的键,然后在第二个循环中擦除它们。
总之,在 C 迭代期间从映射中擦除元素时,请考虑潜在的迭代器失效并根据您使用的 C 版本使用适当的方法。请记住在删除元素之前始终递增迭代器,以保持一致性并避免意外行为。
以上是如何在 C 中迭代时安全地删除映射元素?的详细内容。更多信息请关注PHP中文网其他相关文章!