где итератор продвигается?
Нет, итератор остается в том же месте. Это технически неопределенное поведение, но если вы подумаете о том, что на самом деле делает цикл, вы поймете, почему вы получаете «правильные» результаты.
Ваш вектор содержит указатель на объекты, которые он хранит. Ваш итератор будет указывать на эту память со смещением на нужный элемент. В этом случае это будет указывать на начало данных. Когда вы удаляете первый элемент, итератор становится недействительным, но он по-прежнему указывает на начало вектора. erase
перемещает все элементы вперед, поэтому при переходе к следующей итерации вы находитесь в том же состоянии, в котором находились на первой итерации, за исключением того, что вектор на один элемент меньше. Вы повторяете это до тех пор, пока не останется элементов, и end() == begin()
Вы не должны зависеть от того, что это всегда происходит, и вместо этого просто используйте clear()
, чтобы удалить все элементы из вектора.