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