PassFront
  1. PassFront
  2. База знаний
  3. Массивы и списки

Как устроен динамический массив и что происходит при ресайзе?

Массивы и списки

Динамический массив — это обычный массив с запасом ёмкости: при переполнении выделяется новый буфер примерно вдвое больше, элементы копируются, поэтому push работает амортизированно за O(1).

Устройство

  • size — сколько элементов логически, capacity — сколько влезает физически.
  • Пока size < capacity, вставка в конец — простая запись за O(1).

Ресайз

  • При переполнении: новый буфер ёмкостью 2×capacity и копирование всех элементов за O(n).
  • Редкие копирования размазываются: на n вставок суммарно O(n) работы, в среднем O(1) на операцию — это амортизированный анализ.
  • Коэффициент роста 1.5–2 — компромисс между памятью и числом копирований.

Что нужно знать

  • Ссылки и итераторы на элементы инвалидируются при ресайзе.
  • Уменьшение буфера делают с запасом (например, при заполнении меньше четверти), чтобы capacity не дребезжала на границе.

Коротко для собеседования

Динамический массив держит запас ёмкости и при переполнении перевыделяет буфер с геометрическим ростом, поэтому дорогие копирования редки и push в среднем стоит O(1). Растить нужно в разы, а не на фиксированное число элементов, иначе суммарное копирование станет квадратичным; и помните, что после ресайза старые ссылки на элементы недействительны.

Другие вопросы раздела