Porque, efectivamente, estás realizando una violación de segmento.
Al usar un postdecremento y dereferenciar, no se dereferencia el iterador decrementado sino el iterador aún sin decrementar
Código C++:
Ver original*(it--); // es el iterador end()
it--;
*it // es end() - 1, es correcto
La forma es simplemenete usando un predecremento
ergo
Luego, si usas
push_front la referencia al iterador
end decrementado deja de ser válida a la segunda ejecución de while, por lo que necesitas renovarlo, y en cualquier caso da bucle infinito.
En general no entiendo muy bien la lógica de tu código, será que estoy falto de café o que me acabo de levantar.
Recuerda que si cambias la estructura del
queue o del
vector la estructura del
vector/queue cambia, y los iteradores son referencias completas al elemento referido con referencias tanto al objeto como al trozo de memoria donde se almacena. Cuando incrementas o decrementas el iterador este se mueve en el contexto en que se creó, entonces, si añades un elemento al principio, todo el queue se recoloca moviendo los objetos hacia delante y aumentando en 1 su tamaño, entonces el iterador ya no es válido y has de volver a referenciarlo con respecto a su final, al principio y cualquier referencia absoluta mediante
[index].
Para ciertas cosas puedes usar iteradores reversos com crend y rbegin, entre otros, en que el incremento va hacia atrás, etc.
Un saludo