Vale... ahora he entendido realmente porque hay que usar el método de igualar.
Lo pongo para los que se encuentren con este problema, porque el motivo es cuando menos... "curioso" y si a mi me ha pasado, supongo que les pasará a mas personas.
El caso que tenía:
int main() {
vector<int> A = {1, 2, 3, 4, 5, 6, 7, 8};
vector<int>::iterator it = A.begin();
cout << *it;
A.erase(it);
cout << *it;
}
Funciona, pero
no es correctoint main() {
vector<int> A = {1, 2, 3, 4, 5, 6, 7, 8};
vector<int>::iterator it = A.begin();
cout << *it;
it = A.erase(it);
cout << *it;
}
Así es correcto.
El motivo (que tiene cojones) es que el iterador en realidad apunta a una posición de memoria. Esto puede parecer algo irrelevante, ya que para nosotros el iterador apunta a una casilla del vector.
Pero... ah...
pero el sistema puede mover el vector de unas posiciones de memoria a otras sin avisarnos para optimizar el uso de la memoria. En operaciones de borrado por lo general no debería de haber problemas, pero cuando insertamos en lugar de borrar, el vector aumenta de tamaño, al aumentar de tamaño ocupa mas memoria y si no puede hacerse mas grande en la posición en la que se encuentra, porque los bloques contiguos están ocupados por otras variables (o por lo que sea), el sistema
mueve todo el vector a otras posiciónes de memoria.
Y claro, mueve el vector... pero el iterador se queda "mirando para Cuenca" por decirlo de algún modo. Se queda apuntando a una posición de memoria donde el vector puede ya no estar.
Haciendo estas operaciones como asignaciones, los métodos de insert y erase
devuelven un iterador que siempre apunta al vector resultante . Se mueva o no el vector en la memoria.
Y yo que creía que lo había entendido... pero solo a medias