Elemente aus einem Vektor innerhalb einer Schleife entfernen
Beim Durchlaufen eines Vektors kann es Szenarien geben, in denen Sie Elemente basierend auf entfernen müssen bestimmte Kriterien. Der Versuch, den Vektor während der Iteration zu ändern, kann jedoch zu Laufzeitfehlern führen.
Stellen Sie sich das folgende Szenario vor:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
Mit diesem Code sollen Spieler mit null oder negativem Geld entfernt werden. Es schlägt jedoch mit einem Fehler im Zusammenhang mit dem Zuweisungsoperator fehl. Um dieses Problem zu beheben, vermeiden Sie es, den Iterator innerhalb der Schleife zu erhöhen. Verlassen Sie sich stattdessen auf den Iterator, der von der Funktion erase() zurückgegeben wird.
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
Darüber hinaus erfordert die Verwendung von „operator=“ durch die Funktion erase(), dass die Player-Klasse zuweisbar ist, was bedeutet, dass die Player-Klasse implementiert werden muss ein Zuweisungsoperator.
Erase-Remove Idiom für Vektormanipulation
Um die Aufgabe des Entfernens zu vereinfachen Elemente aus einem Vektor umfassen das Erase-Remove-Idiom:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
Dieses Idiom kombiniert den Algorithmus „remove_if()“ zum Identifizieren der zu löschenden Elemente und die Methode „erase()“ zum Entfernen des erforderlichen Bereichs.
Das obige ist der detaillierte Inhalt vonWie entferne ich während der Iteration in C sicher Elemente aus einem Vektor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!