¿Es seguro aumentar un iterador en el interior cuando se usa como argumento?
Pregunta
Actualmente estoy intentando borrar una secuencia de iteradores de un conjunto, sin embargo, la biblioteca estándar de GCC parece estar dañada porque std :: set :: erase (iterador) debería devolver un iterador (el siguiente iterador), sin embargo, en GCC devuelve void (¿cuál es el estándar?)
De todas formas quiero escribir:
myIter = mySet.erase(myIter);
Pero a GCC no le gusta ... Entonces, ¿es seguro escribir esto en su lugar?
mySet.erase(myIter++);
Editar: Y sí, estoy comprobando contra mySet.end ();
Solución
No hay problema con
mySet.erase(myIter++);
El orden de operación está bien definido: myIter se copia en myTempIter, myIter se incrementa y myTempIter se entrega al método de borrado.
Para Greg y Mark : no, no hay forma de que el operador ++ pueda realizar operaciones después de la llamada para borrar. Por definición, se llama a erase () después de que el operador ++ haya regresado.
Otros consejos
Primero, vuelve a leer el estándar y verás que el prototipo del método set :: erase es:
void erase(iterator position);
Sin embargo, los contenedores asociativos en el STL son estables, ya que el borrado de un elemento no afecta a los iteradores en los otros elementos. Esto significa que la siguiente línea es válida:
iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element