Heim > Backend-Entwicklung > C++ > Hauptteil

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

Mary-Kate Olsen
Freigeben: 2024-11-02 16:23:30
Original
366 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!