Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lösche ich während der Iteration sicher Elemente aus einem „std::vector“?

Wie lösche ich während der Iteration sicher Elemente aus einem „std::vector“?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 16:23:30367Durchsuche

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

Löschen aus einem std::vector während der Iteration

Beim Iterieren über einen std::vector und dem Versuch, ein Element basierend auf a zu löschen Unter dieser Bedingung kann die Verwendung der v[i]-Methode aufgrund der Iterator-Ungültigmachung zu unvorhersehbarem Verhalten führen. Um dieses Problem effektiv anzugehen, wird empfohlen, die richtige Iterationstechnik mithilfe von Iteratoren anzuwenden.

Ein Ansatz besteht darin, die Methode erase() zu verwenden, die einen neuen Iterator zurückgibt. Dies ermöglicht die Fortsetzung der Iteration, ohne den Überblick über die gewünschten Elemente zu verlieren:

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

Beachten Sie, dass wir bei diesem Ansatz das Ende jedes Mal explizit abrufen müssen, da der vorherige Enditerator aufgrund von Löschungen ungültig werden kann .

Eine alternative Methode besteht darin, std::remove_if mit erase() zu kombinieren:

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

Dieser Ansatz ersetzt die O(N2) zeitliche Komplexität des Löschens Elemente einzeln mit einer effizienteren O(N)-Operation. Die Operation erase() entfernt die Elemente, die durch die Operation „remove_if“ markiert wurden.

In Ihrem speziellen Fall können Sie ein benutzerdefiniertes Prädikat erstellen, das die Entfernungsbedingung prüft:

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

Durch den Einsatz dieser Techniken können Sie Elemente effizient aus einem std::vector löschen, während Sie darüber iterieren, ohne die Integrität des Iterationsprozesses zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie lösche ich während der Iteration sicher Elemente aus einem „std::vector“?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn