Вектор по сути является оберткой вокруг массива. Данный массив имеет определенный размер, и данные вектора сохраняются как первые n элементов этого массива, где n - это размер вектора, а размер массива больше или равен п . Когда вы вызываете push_back
, а вектор не имеет достаточного пространства во внутреннем массиве, он создает новый файл большего размера (часто удваивает массив, размер которого теперь недостаточен) и копирует все элементы векторов в этот массив до удаление старого (эти массивы хранятся в куче и создаются через new
и delete
).
Итераторы по сути являются указателями на этот внутренний массив¹. Таким образом, когда вы вызываете push_back, все текущие итераторы могут быть признаны недействительными. Это потому, что, возможно, был создан новый массив, а указатели на старый массив ссылаются на освободившуюся память. Технически, когда вы вызываете push_back и затем разыменовываете итератор, созданный до этого вызова, это неопределенное поведение .
1: Технически они являются классовыми оболочками указателей на внутренний массив, но принцип действует в любом случае. Часто, но не всегда, полезно думать о них просто как о указателях.