2016-04-24 16 views
0

Sehr einfach: Ich habe den folgenden Code und die Methode erase funktioniert nicht. Ich sehe kein Problem da, weil, wenn ich http://www.cplusplus.com/reference/list/list/erase/ gehen, Syntax: iterator erase (iterator position);C++ Löschen aus der Liste der Paare

list<pair<string,int>> l0 { { "name1", 20 }, { "name2", 30 }, { "name3", 40 } }; 
for(auto &it : l0) 
    l0 . erase(it); 

kann ein Problem sein, dass es ein list von pair<string,int> ist und kein list eines grundlegenden Datentypen?

EDIT: Das Problem ist, dass der Code nicht kompilierbar ist.

+0

Hinweis: ' Es wird geändert durch 'Erase()'. –

+0

Neben dem Löschen einer Iteratorposition wird dieser Iterator (oder alle Iteratoren) ungültig, der Code sollte nicht kompiliert werden. –

+0

@ DieterLücking Genau, es wird nicht kompilieren. Übrigens half mir der erste Kommentar nicht. Können Sie mir bitte einen weiteren Hinweis geben? – scarface

Antwort

1

Die range-for iteriert durch einen Container, indem Sie Zugriff auf die Elemente im Container und nicht einen Iterator für ein Element erhalten.

Also in for(auto &it : l0), it ist kein Iterator zu einem Paar aber ein Verweis auf ein Paar. Aus diesem Grunde ist der Code nicht kompiliert

Nachdem dies gesagt ist, wie πάνταῥεῖ wies darauf hin, wenn er dies zunächst als Duplikat Keeping a valid vector::iterator after erase() geschlossen, auch wenn Ihr Code kompilieren würde es wegen der Entwertung nicht funktionieren würde von der Iterator nach dem Löschen:

Iteratoren, Zeiger und Referenzen, die sich auf von der Funktion entfernte Elemente beziehen, werden ungültig. Alle anderen Iteratoren, Zeiger und Referenzen behalten ihre Gültigkeit.

Umgehung

Sie nicht den Bereich-für, aber die traditionelle for und Iterieren mit dem Rückgabewert von erase() verwenden soll:

for (auto it=l0.begin(); it!=l0.end();) 
    it = l0.erase(it); // to avoid incrementing an invalidated iterator 

Live demo

+0

Diese Antwort ist falsch. Nur jedes zweite Element wird gelöscht (es kann auch über das Ende hinaus schreiben). –

+0

@ DieterLücking kannst du ausarbeiten? Weil die Live-Demo etwas zeigt, das perfekt zu funktionieren scheint (der Rückgabewert von Erase() ist "* Ein Iterator, der auf das Element folgt, das dem letzten vom Funktionsaufruf gelöschten Element folgte. Dies ist das Containerende, wenn die Operation den letzten gelöscht hat Element in der Sequenz. * ". – Christophe

Verwandte Themen