Heim >Backend-Entwicklung >C++ >Wie entferne ich Elemente sicher aus einem Vektor in einer C-Schleife?

Wie entferne ich Elemente sicher aus einem Vektor in einer C-Schleife?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-10 03:55:211042Durchsuche

How to Safely Remove Elements from a Vector in a C   Loop?

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.

entfernt

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

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