2012-04-05 13 views
9

¿Se permite borrar un elemento señalado por el iterador y avanzar el mismo iterador en una línea para ir al siguiente elemento?Eliminación de iterador de conjunto C++

set<int>::iterator it = S.begin(); 
while (it != S.end()) { 
    if (shouldBeRemoved(*it)) { 
     S.erase(it++); // is this line valid? 
    } else { 
     ++it; 
    } 
} 

Respuesta

5

¿Se permite borrar un elemento señalado por el iterador, y avanzar en la misma iteración de una línea para ir al siguiente elemento?

Sí, es válido.


Justificación:

it++ incrementos it para que se refiere al siguiente elemento, pero produce una copia de su valor original . Por lo tanto, it no se refiere al elemento que se elimina cuando se llama erase(). Y en el caso de std::set, solo se invalidan los iteradores del elemento borrado. # 1

Puede considerar este ejemplo de código como un código repetitivo para eliminar un elemento al que hace referencia su iterador.


Referencias:

Para std::set,
# 1C++ estándar 03 23.1.2/8:

Solamente los iteradores y las referencias al borrado los elementos están invalidados

2

Sí, es válido. La expresión it++ se evalúa por completo antes de llamar a la función, por lo que la función recibe el valor anterior de it, pero cuando se elimina (e invalida), el iterador ya se ha incrementado.