Анализ потенциальных недостатков применения push_back в std::vector

В приведённом коде ошибки нет. Возможный недостаток push_back — перевыделение памяти при росте vector, которое делает прежние указатели, ссылки и итераторы на элементы недействительными.

Короткий ответ

Что ответить на собеседовании

В приведённом коде ошибки нет. Возможный недостаток push_back — перевыделение памяти при росте vector, которое делает прежние указатели, ссылки и итераторы на элементы недействительными.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо выявить возможные проблемы, связанные с использованием метода push_back при работе с контейнером std::vector.

void vector_method()
{
    std::vector<int> vec;
    // ========
    vec.push_back(1);
    vec.push_back(2);
}

Ответ

В приведённом коде ошибки нет. Возможный недостаток push_back — перевыделение памяти при росте vector, которое делает прежние указатели, ссылки и итераторы на элементы недействительными.

При превышении capacity контейнер выделяет новый буфер и переносит элементы. Поэтому отдельная вставка может стоить O(n), хотя добавление в конец амортизированно занимает O(1).

Если количество элементов заранее известно, можно вызвать vec.reserve(2) перед вставками или сразу написать std::vector<int> vec{1, 2};. Reserve меняет ёмкость, а не размер. Для двух int это скорее вопрос удобства, а не необходимая оптимизация. Ошибка выделения памяти также возможна; никаких ручных delete для vector не нужно.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее