¿Puedes eliminar elementos de una std::list mientras la iteras?

Resuelto AShelly asked hace 15 años • 15 respuestas

Tengo un código que se parece a este:

for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++)
{
    bool isActive = (*i)->update();
    //if (!isActive) 
    //  items.remove(*i); 
    //else
       other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);

Me gustaría eliminar los elementos inactivos inmediatamente después de actualizarlos, para evitar volver a recorrer la lista. Pero si agrego las líneas comentadas, aparece un error cuando llego a i++: "El iterador de lista no es incrementable". Probé algunas alternativas que no incrementaban la declaración for, pero no pude hacer que nada funcionara.

¿Cuál es la mejor manera de eliminar elementos mientras recorre una std::list?

AShelly avatar Feb 28 '09 02:02 AShelly
Aceptado

Primero debe incrementar el iterador (con i++) y luego eliminar el elemento anterior (por ejemplo, usando el valor devuelto de i++). Puedes cambiar el código a un bucle while así:

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}
Michael Kristofik avatar Feb 27 '2009 19:02 Michael Kristofik

Quieres hacer:

i= items.erase(i);

Eso actualizará correctamente el iterador para que apunte a la ubicación después del iterador que eliminó.

MSN avatar Feb 27 '2009 19:02 MSN