¿Es seguro aumentar un iterador en el interior cuando se usa como argumento?

StackOverflow https://stackoverflow.com/questions/161166

  •  03-07-2019
  •  | 
  •  

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 ();

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top