迭代時從std::vector 擦除
迭代std::vector 並嘗試擦除基於條件下,使用v[i ] 方法可能會因迭代器失效而導致不可預測的行為。為了有效地解決這個問題,建議使用迭代器來採用正確的迭代技術。
一種方法是使用擦除()方法,該方法傳回一個新的迭代器。這允許繼續迭代而不會丟失對所需元素的追蹤:
<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>
請注意,在這種方法中,我們必須每次都明確獲取結束,因為前一個結束迭代器可能會因擦除而失效.
另一種方法是將std::remove_if 與erase() 結合起來:
<code class="cpp">iterator it = std::remove_if(begin, end, pred); vec.erase(it, vec.end());</code>
這種方法取代了O(N 2) 的擦除時間複雜度單一元素具有更有效率的O(N) 操作。擦除()操作刪除已由remove_if操作標記的元素。
在您的特定情況下,您可以建立一個自訂謂詞來檢查刪除條件:
<code class="cpp">class remove_by_caller { public: remove_by_caller(AguiWidgetBase* pWidget) : mWidget(pWidget) {} template <typename T> bool operator()(const T& pX) const { return pX.getCaller() == mWidget; } private: AguiWidgetBase* mWidget; }; std::vector<AguiTimedEvent>::iterator it = std::remove_if(timedEvents.begin(), timedEvents.end(), remove_by_caller(widget)); timedEvents.erase(it, timedEvents.end());</code>
透過採用這些技術,您可以在迭代std::vector 時有效地刪除其中的元素,而不會影響迭代過程的完整性。
以上是如何在迭代時安全地刪除'std::vector”中的元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!