¿Puedes eliminar elementos de una std::list mientras la iteras?
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?
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;
}
}
Quieres hacer:
i= items.erase(i);
Eso actualizará correctamente el iterador para que apunte a la ubicación después del iterador que eliminó.