Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/03/2013, 00:44
Avatar de dontexplain
dontexplain
 
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 5 meses
Puntos: 127
Respuesta: Violación de segmento usando deque

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
  1. *(it--); // es el iterador end()
  2.  
  3. it--;
  4. *it // es end() - 1, es correcto

La forma es simplemenete usando un predecremento

Código C++:
Ver original
  1. *(--it);

ergo

Código C++:
Ver original
  1. temp = ( *(--it) * i) + remainder;

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
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 04/03/2013 a las 01:30