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

如何在迭代時安全地刪除'std::vector”中的元素?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-02 16:23:30501瀏覽

How to Safely Erase Elements from an `std::vector` While Iterating?

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

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