2010-06-16 6 views

Antwort

6

Sie brauchen nicht eine Schleife als youre mit einem Satz zu tun.

std::set<Color>::iterator it = myColorContainer.find(Yellow); 
if (it != it.myColorContainer.end()){ 
    DoSomeProcessing(*it); 
    myColorContainer.erase(it); 
} 
+1

Code ist standardkonform. Ich stimme @Viktor sehr zu Dies wäre der bevorzugte Weg um ein Element aus dem Set zu entfernen. In der Frage wird jedoch gefragt, wie das Code-Snippet funktioniert. –

+0

@daramarak: Ich glaube, du hast geantwortet, während ich den Code bearbeitet habe (dachte, es wäre ein std :: vector in meinem ersten Beitrag) –

7

Versuche:

for(std::set<Color>::iterator it = myColorContainer.begin(); 
    it != myColorContainer.end();) { // note missing it++ 
    if((*it) == Yellow) { 
     DoSomeProcessing(*it); 
     myColorContainer.erase(it++); // post increment (original sent to erase) 
    } 
    else { 
     ++it; // more efficient than it++; 
    } 
} 
+0

Dies funktioniert auch nicht. Sie sollten den Rückgabewert von Erase erneut zuweisen. – Patrick

+0

Der zurückgegebene Iterator ist eine Microsoft-spezifische Implementierung, die den Standard bricht: http://msdn.microsoft.com/en-us/library/8h4a3515%28VS.80%29.aspx. Sicher genug, müssen Sie den Iterator nach dem Löschen erhöhen. –

+1

Diese Lösung ist perfekt, wenn Sie die m $ -spezifische Implementierung nicht verwenden können und eine Schleife verwenden müssen. Wenn Sie keine Schleife verwenden müssen, ist Viktors Option noch besser. Danke für eine tolle Antwort. Du warst eine große Hilfe. – scippie

2
for (std::set<Color>::iterator i = myColorContainer.begin(); 
      i!=myColorContainer.end(); /* No i++ */) 
{ 
    if (*i == Yellow) 
    { 
     DoSomeProccessing(*i); 
     std::set<Color>::iterator tmp = i; 
     ++i; 
     myColorContainer.erase(tmp); 
    } 
    else { 
     ++i; 
    } 
} 

Sobald Sie mit ++i zur nächsten Nachricht gehen wird garantiert, um gültig zu sein - Eigentum von std::set, die auf eingefügten Elemente Iteratoren nie, es sei denn das Element für ungültig erklärt entfernt wird.

So können Sie jetzt den vorherigen Eintrag sicher löschen.

Verwandte Themen