При добавлении элемента в std::vector (например, с помощью push_back) происходят следующие шаги:
- Проверка вместимости (capacity): Вектор проверяет, достаточно ли текущей выделенной памяти (capacity) для размещения нового элемента.
- Расширение, если необходимо:
- Если
size() < capacity(), новый элемент просто размещается в следующем свободном месте, и size() увеличивается на 1.
- Если
size() == capacity(), вектор должен увеличить свою вместимость. Обычно это делается путем выделения нового, большего блока памяти. Типичный размер нового блока памяти в несколько раз превышает текущий (например, удваивается).
- Копирование/Перемещение элементов (при расширении): Все существующие элементы из старого блока памяти копируются (или перемещаются, если тип элемента поддерживает перемещение и доступен подходящий конструктор/оператор) в новый блок памяти.
- Размещение нового элемента: Новый элемент добавляется в конец нового блока памяти.
- Освобождение старой памяти: Старый блок памяти освобождается.
- Обновление указателей/размеров: Внутренние указатели (указывающие на начало и конец данных, а также на конец выделенной памяти) обновляются, а также увеличивается значение
size().
Это потенциально дорогостоящая операция из-за возможного перевыделения памяти, копирования/перемещения элементов и освобождения старой памяти. Это также может invalidate итераторы и ссылки, указывающие на элементы вектора до добавления.