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

Wie entferne ich beim Iterieren in C sicher Elemente aus einem Vektor?

Linda Hamilton
Freigeben: 2024-12-06 07:19:11
Original
329 Leute haben es durchsucht

How to Safely Remove Elements from a Vector While Iterating in C  ?

Elemente aus einem Vektor innerhalb einer Schleife entfernen

Beim Durchlaufen eines Vektors mithilfe einer for-Schleife besteht eine häufige Aufgabe darin, Elemente basierend auf zu entfernen nach bestimmten Kriterien. Der Versuch, ein Element innerhalb der Schleife selbst zu entfernen, kann jedoch zu Fehlern führen.

Beachten Sie den folgenden Code:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)
{
    if(it->getpMoney() <= 0) 
        it = allPlayers.erase(it);
    else 
        ++it;
}
Nach dem Login kopieren

Dieser Code versucht, Spieler mit negativem oder null Geld aus dem Vektor zu entfernen alleSpieler. Es kommt jedoch zu der Fehlermeldung:

Funktion „operator =“ ist in „Player“ nicht verfügbar

Das Problem

Der Fehler tritt auf, weil Die Methode erase() verwendet intern den Zuweisungsoperator =, um Elemente innerhalb des Vektors zu verschieben. Um erase() verwenden zu können, müssen die Player-Objekte zuweisbar sein, was eine Implementierung des Operator= für die Player-Klasse erfordert.

Die Lösung

Um das Problem zu beheben, Vermeiden Sie es, es innerhalb der for-Schleife zu erhöhen:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/)
{
    if(it->getpMoney() <= 0) 
        it = allPlayers.erase(it);
}
Nach dem Login kopieren

Implementieren Sie den Operator= für die Player-Klasse, um die Zuweisung von Objekten innerhalb der zu ermöglichen vector.

Alternativer Ansatz unter Verwendung von Algorithmen

Um den Code zu vereinfachen, sollten Sie die Verwendung des Erase-Remove-Idioms in Betracht ziehen:

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(), 
        allPlayers.end(),
        [](Player const &amp; p) { return p.getpMoney() <= 0; }
    ), 
    allPlayers.end()
); 
Nach dem Login kopieren

Dieser Code verwendet die std::remove_if()-Algorithmus, um Spieler mit negativem oder keinem Geld herauszufiltern, und verwendet dann erase(), um sie aus dem zu entfernen Vektor.

Das obige ist der detaillierte Inhalt vonWie entferne ich beim Iterieren in C sicher Elemente aus einem Vektor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage