2017-02-09 3 views
1

Ich versuche Elemente in einer Liste zu entfernen, wenn eine Bedingung in einem std::list erfüllt ist. Was ich in der Referenz über den Rückgabewert der Funktion erase gelesen haben:Entfernen Sie einen Eintrag aus einer Std :: Liste während Iterator

Ein Iterator zeigt auf das Element, das das letzte Element gefolgt durch den Funktionsaufruf gelöscht. Dies ist das Containerende, wenn die Operation das letzte Element in der Sequenz gelöscht hat.

Member-Typ-Iterator ist ein bidirektionaler Iterator-Typ, der auf Elemente zeigt.

ich dieses Beispiel zusammengestellt haben:

#include <string> 
#include <list> 
#include <iostream> 

int main() 
{ 
     typedef std::list<std::string> string_list_t; 
     string_list_t list; 
     list.push_back("test1"); 
     list.push_back("test2"); 
     list.push_back("test3"); 
     list.push_back("test4"); 
     list.push_back("test5"); 
     list.push_back("test6"); 
     list.push_back("test7"); 
     list.push_back("test8"); 

     for (string_list_t::iterator it = list.begin(); it != list.end(); ++it) 
     { 
       std::string &str = *it; 
       std::cout << "Checking " << str << "..." << std::endl; 
       if (str == "test4") 
       { 
         std::cout << "Found test4!" << std::endl; 
       } 
       else 
       { 
         it = list.erase(it); 
       } 
     } 


    return 0; 
} 

Es gibt mir nicht die erwartete Leistung, stattdessen gibt es mir:

Checking test1... 
Checking test3... 
Checking test5... 
Checking test7... 

Kann mir jemand helfen, herauszufinden, was ich verstanden falsch? Irgendwie überspringt es jedes zweite Element ...

Antwort

4

Sie überspringen das Element nach dem gelöschten.

Sie sollten entwederit = list.erase(it); oder ++it, aber nicht beide verwenden.

+1

gnaaaaah dingt. Danke! – Nidhoegger

2

Wenn Sie ein Element aus einer std::list löschen, erhöhen Sie nicht den von der std::list::erase-Methode zurückgegebenen Iterator. Sie werden nicht einfach das nächste Element überspringen, Sie können nur einen end() Iterator inkrementieren.

die Schleife ändern:

for (string_list_t::iterator it = list.begin(); it != list.end();) 
                   //^^ Not incremented 
     { 
       std::string &str = *it; 
       std::cout << "Checking " << str << "..." << std::endl; 
       if (str == "test4") 
       { 
         std::cout << "Found test4!" << std::endl; 
         ++it;   //increment 
       } 
       else 
       { 
         it = list.erase(it); 
       } 
     } 

es anzeigen Live Here

Verwandte Themen