2010-06-16 32 views

Respuesta

6

No es necesario un bucle que usted está tratando con un conjunto.

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

cumple con los estándares. Estoy de acuerdo @ Viktor Sehr, esta sería la forma preferida de eliminar un elemento del conjunto. Sin embargo, la pregunta pregunta cómo hacer que el fragmento de código funcione. –

+0

@daramarak: Creo que respondiste mientras editaba el código (pensé que era un estándar :: vector en mi primera publicación) –

7

Probar:

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

Esto tampoco funcionará. Debería asignarle nuevamente el valor de retorno de borrar. – Patrick

+0

El iterador devuelto es una implementación específica de Microsoft que rompe el estándar: http://msdn.microsoft.com/en-us/library/8h4a3515%28VS.80%29.aspx. Efectivamente, necesita incrementar el iterador después del borrado. –

+1

Esta solución es perfecta si no puede usar la implementación específica de m $ y necesita usar un bucle. Si no necesita usar un bucle, la opción de Viktor es aún mejor. Gracias por una gran respuesta. Has sido de gran ayuda. El código – 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; 
    } 
} 

Una vez que ir al siguiente mensaje con ++i se garantiza que sea válida - propiedad de std::set que iteradores sobre elementos insertados no se invalidan menos que se elimine el elemento .

Ahora puede borrar con seguridad la entrada anterior.

Cuestiones relacionadas