В комментариях был поднят вопрос, почему среда выполнения отладки Microsoft поднимает утверждение во время итерации по вектору, но не по списку. Причина в том, что insert
определяется по-разному для list
и vector
(обратите внимание, что push_back
это просто insert
в конце последовательности).
В соответствии со стандартом C ++ (ISO / IEC 14882: 2003 23.2.4.3, векторные модификаторы ):
[при вставке], если перераспределения не происходит, все итераторы и ссылки до точки вставки остаются действительными.
(23.2.2.3, список модификаторов ):
[insert] не влияет на достоверность итераторов и ссылок.
Итак, если вы используете push_back
(и уверены, что это не приведет к перераспределению), то в любом контейнере можно продолжать использовать ваш итератор для итерации по остальной части последовательности.
Однако в случае вектора неопределенное поведение использовать итератор end
, полученный вами до push_back
.
Это окольный ответ на вопрос; это прямой ответ на обсуждение в комментариях к вопросу.