Justo ahora, estoy leyendo el libro de AWL de Josuttis.C++ iterador de deque invalidado después de push_front()
Por lo que yo sé, el vector C++ es una matriz c que se puede reasignar. Entonces, entiendo, ¿por qué después de push_back() todos los iteradores y referencias pueden dejar de ser válidos?
Pero mi pregunta es sobre std :: deque. Como sé, es una matriz de bloques grandes (c-array de c-arrays). Así que push_front() inserta un elemento al principio y si no hay espacio, deque asigna un nuevo bloque y coloca el elemento al final del bloque asignado.
Después de insertar() en el medio, todas las referencias e iteradores se vuelven inválidos y entiendo por qué: se mueven todos los elementos. Pero realmente malinterpreto la frase "... después de push_back() y push_front() todas las referencias siguen siendo válidas, pero los iteradores no" (la misma frase se puede encontrar @ estándar: 23.2.2.3)
¿Qué hace? ¡¿media?! Si las referencias son válidas, deque deque no podría reasignar (== mover) sus elementos. Entonces, ¿por qué los iteradores se vuelven inválidos? ¿Por qué no puedo usarlos después de la inserción de elementos no móviles? ¿O significa la frase, que no puedo estar seguro acerca de la igualdad de los iteradores para comenzar() o terminar() y desbordar?
Además, quiero mencionar, que después de borrar() todos los iteradores y referencias permanecen válidos (excepto el borrado :-)).
PD: por favor, no responda en forma "estándar": "no se puede usar porque EL ESTÁNDAR lo dice". Quiero entender por qué, qué puede pasar.
puede estar en lo cierto. pero cómo deben implementarse los iteradores, para que se vuelva inválido después de insertar una nueva página. o pueden tener campo "número de páginas" que se vuelven incorrectas? – f0b0s
Imagino que el iterador tendría dos campos: uno de ellos un puntero en la "matriz de punteros" a la izquierda, y el otro un puntero o desplazamiento en la correspondiente "página de datos" a la derecha. Entonces, el incremento se implementaría como (1) incrementa la posición en la página de datos, (2) si llega al final de la página, incrementa la posición en el índice maestro y restablece la posición de la página de datos al inicio de la página siguiente . Por lo tanto, si el índice maestro se reasigna, el iterador deja de ser válido. –
@oebyone, sí! gran respuesta, ¡tienes razón! Gracias. – f0b0s