Вот цитата из документации SGI по STL (http://www.sgi.com/tech/stl/Vector.html):
[5] Итераторы вектора становятся недействительными, когда его память перераспределяется. Кроме того, вставка или удаление элемента в середине вектора делает недействительными все итераторы, которые указывают на элементы после точки вставки или удаления. Из этого следует, что вы можете предотвратить аннулирование итераторов вектора, если вы используете Reserve () для предварительного выделения столько памяти, сколько будет использоваться вектором, и если все вставки и удаления находятся в конце вектора.
Я думаю, из этого следует, что pop_back делает недействительным только итератор, указывающий на последний элемент и итератор end (). Нам действительно нужно увидеть данные, для которых код не работает, а также то, как он не может решить, что происходит. Насколько я могу судить, код должен работать - обычная проблема в таком коде состоит в том, что удаление элемента и ++ на итераторе происходит в одной и той же итерации, как указывает @mikhaild. Однако в этом коде это не так: это ++ не происходит, когда вызывается pop_back.
Что-то плохое все еще может случиться, когда оно указывает на последний элемент, а последний элемент меньше 10. Сейчас мы сравниваем недействительные it и end (). Это может все еще работать, но никакие гарантии не могут быть сделаны.