Heim >Backend-Entwicklung >C++ >Wie kann man Elemente während der Iteration effizient aus einem Vektor löschen, ohne den Iterator ungültig zu machen?

Wie kann man Elemente während der Iteration effizient aus einem Vektor löschen, ohne den Iterator ungültig zu machen?

Susan Sarandon
Susan SarandonOriginal
2024-11-04 07:37:021080Durchsuche

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

Effizientes Löschen aus einem Vektor während der Iteration

Beim Durchlaufen eines Vektors kann es erforderlich sein, Elemente zu entfernen, die bestimmte Kriterien erfüllen. Eine einfache Entfernung kann jedoch dazu führen, dass der für die Schleife verwendete Iterator ungültig wird. Dieser Artikel bietet eine Lösung zum effizienten Löschen von Elementen ohne Verwendung der v[i]-Methode.

Aufrechterhaltung des Iterators nach dem Löschen

Die Methode erase() gibt einen neuen Iterator zurück zeigt auf das Element nach dem entfernten Element. Dies ermöglicht eine kontinuierliche Iteration durch Aktualisierung der Schleifenbedingung:

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

Kombination von „remove_if“ und „erase“

Um den Entfernungsprozess zu optimieren, sollten Sie die Verwendung von „std::remove_if“ und „erase“ in Betracht ziehen zusammen:

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

Dieser Ansatz trennt die Entfernung geeigneter Elemente von ihrer tatsächlichen Entfernung, was zu einem schnelleren O(N)-Vorgang führt.

Beispiel mit vorlagenbasierter Entfernung

Um den Entfernungsprozess zu verallgemeinern, verwenden Sie ein vorlagenbasiertes Prädikat und die Klasse „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>

Durch diese Ansätze ist es möglich, Elemente effizient aus einem Vektor zu löschen und dabei die zu erhalten Iterator.

Das obige ist der detaillierte Inhalt vonWie kann man Elemente während der Iteration effizient aus einem Vektor löschen, ohne den Iterator ungültig zu machen?. 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