在迭代期间从 std::Vector 中删除元素
当您有一个元素向量并且需要在迭代它时删除项目时,erase() 方法可能会造成困难。擦除一个元素会使指向后续元素的所有迭代器失效。
迭代器和擦除()
考虑以下代码:
<code class="cpp">std::vector<std::string> m_vPaths; ... for (auto iter = m_vPaths.begin(); iter != m_vPaths.end(); iter++) { std::string strPath = *iter; if (::DeleteFile(strPath.c_str())) { m_vPaths.erase(iter); // Iterators become invalid after erase } }</code>
之后第一次成功删除文件,指向下一个元素的迭代器就失效了。这使得迭代的继续变得复杂。
使用两个向量
一种解决方案是使用两个向量:一个用于迭代,另一个用于存储要删除的元素。虽然这有效,但它引入了额外的内存开销和复杂性。
替代数据结构
有些数据结构更适合在迭代期间删除元素,例如:
这些结构维护有序或无序的值集合,删除不会使其他元素无效。
使用 std::remove_if
或者,您可以使用 std::remove_if() 算法从向量中删除特定元素,然后再删除它们。这可确保迭代器保持有效:
<code class="cpp">auto iter_new_end = std::remove_if(m_vPaths.begin(), m_vPaths.end(), [](const std::string& strPath) { return ::DeleteFile(strPath.c_str()); }); m_vPaths.erase(iter_new_end, m_vPaths.end());</code>
结论
根据您的具体要求,您可以从以下选项中选择最佳方法:
以上是如何在迭代期间安全地从 std::vector 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!