迭代 std::vector 并执行需要修改向量大小的操作(例如删除)时元素,您可能会遇到迭代器无效的问题。这是因为用于删除元素的擦除()方法会更改向量的大小并使所有现有迭代器无效。
要克服这个问题,一个有效的解决方案是使用返回值的erase()方法,它提供了一个新的、有效的迭代器,指向紧随被删除元素之后的元素。这使您可以继续迭代,而不必担心无效的迭代器。
以下代码演示了这种方法:
<code class="cpp">std::vector<std::string>::iterator iter; for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) { if (::DeleteFile(iter->c_str())) { iter = m_vPaths.erase(iter); // Returns a new valid iterator } else { ++iter; // Advance iterator if file deletion failed } }</code>
在此代码中,iter 迭代器更新为指向每次成功删除文件后的下一个元素,使迭代能够顺利进行。
虽然使用迭代器方法效率很高,但它仍然修改了原始的 m_vPaths 向量,这可能会提高性能如果您需要进行多次删除,则会产生影响。在这种情况下,最好考虑使用针对有效删除元素而优化的替代数据结构,例如:
以上是如何在迭代过程中有效地从 std::vector 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!