2013-12-17 2 views
8

Wie kann ich Elemente entfernen von einem std::set während über sie iterierenSo entfernen Sie Elemente aus einem std :: gesetzt, während über sie iterieren

Mein erster Versuch wie folgt aussieht:

set<T> s; 

for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) { 
    //Do some stuff 
    if(/*some condition*/) 
     s.erase(iter--); 
} 

Aber dies problematisch ist wenn wir das erste Element aus der Menge entfernen wollen, weil iter-- den Iterator ungültig macht.

Was ist der Standard Weg, dies zu tun?

Antwort

13

Standard-Weg ist, etwas zu tun, wie

for(set<T>::iterator iter = s.begin(); iter != s.end();) 
{ 
    if(/*some condition*/) 
    { 
     s.erase(iter++); 
    } 
    else 
    { 
     ++iter; 
    } 
} 

Mit der ersten Bedingung, die wir sicher sind, dass iter nicht ohnehin für ungültig erklärt werden, da eine Kopie von iter wird in Lösch weitergegeben werden, aber unsere iter ist bereits inkrementiert, bevor das Löschen aufgerufen wird.

in C++ 11, wird der Code sein wie

for(set<T>::iterator iter = s.begin(); iter != s.end();) 
{ 
    if(/*some condition*/) 
    { 
     iter = s.erase(iter); 
    } 
    else 
    { 
     ++iter; 
    } 
} 
+0

Die erste peice Code sagen, eine Behauptung nicht, dass die Iteratoren in der visuellen studion unvereinbar sind. Jedenfalls gibt std :: erase den neuen Iterator zurück, wie Sie in Ihrem Code darauf hingewiesen haben. – sajas

Verwandte Themen