Heim >Backend-Entwicklung >C++ >Wie entferne ich Elemente sicher aus einem Vektor in einer C-Schleife?
Elemente aus einem Vektor innerhalb einer Schleife löschen
Eine häufige Aufgabe bei der Arbeit mit Vektoren besteht darin, bestimmte Elemente basierend auf ihren Attributen zu entfernen. Das Aktualisieren des Vektors während der Iteration kann jedoch zu unerwarteten Fehlern führen.
Betrachten wir den folgenden Codeausschnitt:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
Dieser Code zielt darauf ab, Spieler mit null oder weniger Geld aus dem zu entfernen allPlayers-Vektor. Die Ausführung dieses Codes führt jedoch häufig zu der Fehlermeldung:
Die Funktion „operator =“ ist in „Player“ nicht verfügbar
Fehlerursache:
Der Fehler tritt auf, weil std::vector::erase intern den Zuweisungsoperator (=) verwendet, um Elemente innerhalb des Vektors zu verschieben. Um das Löschen zu verwenden, muss die Player-Klasse den Zuweisungsoperator implementieren.
Lösung ohne Zuweisungsoperator:
Um die Anforderung des Zuweisungsoperators zu vermeiden, kommentieren Sie die it-Zeile in aus Schleife:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); }
Durch Entfernen des It-Inkrements schreitet der Iterator nach jedem Löschen automatisch voran Operation.
Refactoring mit Erase-Remove Idiom:
Eine sauberere Lösung ist die Verwendung des Erase-Remove Idioms, das eine präzise und effiziente Möglichkeit bietet, Elemente aus zu entfernen ein Vektor:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
Bei diesem Ansatz filtert std::remove_if den Vektor basierend auf dem bereitgestellten Lambda-Ausdruck. Die gefilterten Elemente werden dann mit std::vector::erase.
entferntDas obige ist der detaillierte Inhalt vonWie entferne ich Elemente sicher aus einem Vektor in einer C-Schleife?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!