在迭代期間從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中文網其他相關文章!