2017-02-27 5 views
-1

EDIT: Diese Frage bezieht sich speziell auf std :: Listen - ähnliche Fragen auf Stack-Überlauf std :: siehe VektorenC++ Liste Iteration und Löschen

Ich bin mit C++ und Probleme, ein Element aus einem std Löschen :: liste während des Durchlaufens auf. Ich habe eine Liste von einer benutzerdefinierten Klasse (‚Objekte‘ für die Zwecke dieser Frage), und mein Code sieht wie folgt aus:

for(auto i : Objects) 
    if(i.EraseFlag == true) 
     { 
      i = Objects.erase(i); 
     } 

ich den Fehler bekommen: ‚keine passende Funktion für Aufruf von std: : list :: list (Objekt &) '

Ich glaube, das ist der richtige Weg (wie in C++ 11), Listen zu durchlaufen, ein Element zu löschen und einen Iterator zurückzugeben, der das Löschen berücksichtigt, aber klar Ich mache etwas falsch. Früher würde ich bei der Verwendung von Vektoren 'Objects.esease (Objects.begin() + i)' verwenden, wobei i eine ganze Zahl in einer for-Schleife ist, aber angesichts der Zugriffsanforderungen von Listen wird dies nicht funktionieren.

Hilfe geschätzt.

Dank

+0

erase() nimmt einen Iterator als Parameter –

+1

Sie sollten nicht die Sequenz während der Bereich basiert 'for' Schleife zu verändern. – PaulMcKenzie

+1

* Ich glaube, das ist der richtige Weg (wie in C++ 11), Listen zu durchlaufen, ein Element zu löschen und einen Iterator zurückzugeben, der das Löschen berücksichtigt, * - Warum solche Dinge löschen, wenn Sie dies tun können 'Erase/Remove'-Idiom, wo keine Loops benötigt werden? – PaulMcKenzie

Antwort

1

Mitglied Funktion erase beschäftigt sich mit Iteratoren.

Für eine solche Aufgabe wäre es richtig, eine normale for-Schleife zu verwenden. Zum Beispiel

for (auto it = Objects.begin(); it != Objects.end();) 
{ 
    if (it->EraseFlag) it = Objects.erase(it); 
    else ++it; 
} 

Ein anderer Ansatz besteht darin, die Elementfunktion remove_if zu verwenden. Zum Beispiel

Objects.remove_if([](const auto &value) { return value.EraseFlag; }); 
+0

Danke Vlad, Ihre erste Schleife scheint zu funktionieren. Es sieht mit remove_if wäre der beste Weg, um dies zu tun, die Sie auch enthalten, so dass ich dies als die Antwort – nathanburns

+0

@nathanburns Nein überhaupt markieren werde. Bitte schön. –