Изменение размера вектора не уничтожает значения, хранящиеся в векторе (за исключением тех, которые выходят за рамки нового размера, конечно, при уменьшении), однако при увеличении вектора до его емкости копирование (или, в C ++ 11, перемещение ) их на новое место, что делает недействительными и итераторы, указатели или ссылки на эти элементы.
В вашем примере программы вы не сохраняете итераторы, указатели или ссылки на векторные элементы во время изменения размера, поэтому вы получаете доступ к скопированным значениям, если данные были скопированы во время изменения размера (что вероятно, но не полностью определено; вектор может выделять место для большего количества элементов, чем нужно; более того, при его увеличении должно сделать это для выполнения требований сложности).
Вы можете получить текущую емкость (количество элементов, на которое вы можете увеличить ее до того, как потребуется перераспределение) через функцию-член capacity
. Пока вектор не выходит за пределы текущей емкости, даже итераторы, указатели и ссылки на хранимые объекты безопасны. Кроме того, если вы хотите убедиться, что никакие итераторы, указатели или ссылки недействительны, и вы заранее знаете максимальный размер, до которого может расти вектор, то вы можете предварительно выделить всю необходимую память с помощью функции-члена reserve
.