首頁  >  文章  >  後端開發  >  如何在迭代期間安全地從 std::vector 中刪除元素?

如何在迭代期間安全地從 std::vector 中刪除元素?

Patricia Arquette
Patricia Arquette原創
2024-10-30 07:35:02337瀏覽

How to Safely Remove Elements from a std::vector During Iteration?

在迭代期間從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::set >(有序且唯一,自然降序排序)
  • std::unordered_set(無序且唯一)

這些結構維護有序或無序的值集合,刪除不會使其他元素無效。

使用 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::remove_if()

以上是如何在迭代期間安全地從 std::vector 中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn