首頁 >後端開發 >C++ >如何在迭代過程中有效地刪除向量中的元素而不使迭代器失效?

如何在迭代過程中有效地刪除向量中的元素而不使迭代器失效?

Susan Sarandon
Susan Sarandon原創
2024-11-04 07:37:021083瀏覽

How to Efficiently Erase Elements from a Vector During Iteration Without Invalidating the Iterator?

迭代期間從向量中高效擦除

迭代向量時,可能需要刪除滿足特定條件的元素。但是,直接刪除可能會使用於循環的迭代器失效。本文提供了一種無需使用 v[i] 方法即可高效擦除元素的解決方案。

擦除後維護迭代器

erase() 方法傳回一個新的迭代器指向被刪除元素之後的元素。這允許透過更新循環條件來繼續迭代:

<code class="cpp">for(iterator it = begin; it != end(container); it = vec.erase(it))
{
    if (it->somecondition())
    {
        it = vec.erase(it);
    }
}</code>

組合remove_if和erase

要最佳化刪除過程,請考慮使用std::remove_if和erase一起:

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

這種方法將符合條件的元素的刪除與實際刪除分開,從而實現更快的O(N) 操作。

基於模板的刪除範例

為了概括刪除過程,請使用基於模板的謂詞和remove_by_caller類別:

<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>

透過這些方法,可以有效地從向量中刪除元素,同時保持迭代器。

以上是如何在迭代過程中有效地刪除向量中的元素而不使迭代器失效?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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