首頁 >後端開發 >C++ >如何在迭代過程中安全地刪除 std::vector 中的元素?

如何在迭代過程中安全地刪除 std::vector 中的元素?

Barbara Streisand
Barbara Streisand原創
2024-11-01 12:24:02974瀏覽

How to Safely Erase Elements From a std::vector During Iteration?

迭代期間從std::vector 中刪除元素:策略和效能

當需要擦除時迭代std::vector 時對於基於條件的元素,使用帶有迭代器的for 循環的傳統方法可能會遇到問題。擦除元素會使迭代器無效,從而使循環不完整。為了應對這項挑戰,讓我們探索處理此類場景的最佳策略。

使用失效追蹤進行迭代

一種方法是明確追蹤由擦除元素引起的迭代器失效。在提供的範例程式碼中:

<code class="cpp">for (iterator it = begin; it != end(container) /* !!! */; )
{
    if (it->somecondition())
    {
        it = vec.erase(it); // Returns the new iterator to continue from.
    }
    else
    {
        ++it;
    }
}</code>

這裡的主要區別是使用 end(container) 而不是預先計算的 end,它會在每次擦除操作後更新迭代器引用。這確保了循環期間有效的迭代器比較。

組合 std::remove_if 和擦除

更有效的方法涉及組合 std::remove_if 和擦除函數。這透過消除失效追蹤的需要來優化流程:

<code class="cpp">iterator it = std::remove_if(begin, end, pred);
vec.erase(it, vec.end());</code>

這裡,pred 表示確定要刪除哪些元素的刪除謂詞。這種方法消除了與迭代擦除相關的 O(N^2) 複雜性,並將效能提高到 O(N)。

範例應用程式

在提供的程式碼範例中, RemoveTimedEvent 結構體用作刪除謂詞,用於識別和刪除與定時事件向量中的特定小部件關聯的事件。

透過利用其中一種策略,您可以在迭代,同時保持正確的迭代器功能和效能。

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

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