Все сосредоточились на том, чтобы сказать this is undefined behavior fix code
, но вопрос был в том, почему это работает.
Чтобы понять, почему это работает, вы должны понять, как vector
работает более или менее.
- Вектор выделяет некоторый блок памяти для хранения элементов.
- размер этого блока определяется емкость , которая говорит, сколько элементов может быть сохранено в векторе, без выделения нового блока памяти
capacity
обычно больше size
из vector
- Теперь, когда вы удаляете элементы из вектора,
capacity
и выделенный блок памяти не изменяется. Это оптимизация. - когда вы удаляете элемент из спины, просто вызывается деструктор (для
int
он ничего не делает) и размер вектора уменьшается. - ваше значение не очищается, только помечается как из векторного размера
- , поэтому, когда вы используете
operator[]
, он не проверяет, превышаете ли вы его размер. Он просто возвращает значение по указанным c сумматорам - , поскольку
pop_back
только что уменьшенный вами размер все еще там
Обратите внимание, если вы позвоните shrink_to_fit после pop_back
велика вероятность того, что будет, и с cra sh, иначе вы не получите такое же значение. Тем не менее, это неопределенное поведение, и может произойти все что угодно.
Еще один способ увидеть ваш код плохо - использовать at
, который проверяет, находится ли индекс в допустимом диапазоне.