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