std::vector w C++ to nic innego jak zwyczajna nakładka na dynamiczną tablicę. Dynamiczna tablica, której wskaźnikiem dysponuje wektor, ma pewną zarezerwowaną wielkość.
Gdy dodajesz nowy element do wektora, a miejsca zabraknie - to przydzielany jest zupełnie nowy obszar pamięci, gdzie wszystkie dane wektora zostaną przekopiowane.
No więc masz wskaźnik na za-ostani element wektora:
auto iter = wektor.end();
kiedy dodajesz nowy item:
wektor.push_back( 5 );
miejsca brakuje... Dla wektora przydzielana jest nowa pamięć, a twój wskaźnik iter przestaje być poprawny.
"Rozwiązaniem" jest określenie na początku minimalnej pojemności wektora, w tym wypadku minimum 6:
wektor.reserve(6);
W praktyce nie powinno się używać wskaźnika na wektor sprzed jego (wektora) modyfikacji, bo nie masz gwarancji co do poprawności adresu na który on wskazuje.