В приведённом коде ошибки нет. Возможный недостаток push_back — перевыделение памяти при росте vector, которое делает прежние указатели, ссылки и итераторы на элементы недействительными.
Анализ потенциальных недостатков применения push_back в std::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.