Sobes.tech
Назад к вопросам
Junior — Middle
85

Как различается по скорости выполнение операции вставки элементов в контейнеры list и vector?

Ответ от нейросети

sobes.tech AI

Вставка элементов в std::list и std::vector отличается по скорости из-за их внутренней структуры:

  • std::list — это двусвязный список. Вставка элемента в любое место списка (если есть итератор на позицию) происходит за константное время O(1), так как нужно просто перенастроить указатели соседних элементов.

  • std::vector — это динамический массив. Вставка в конец обычно амортизированно за O(1), но вставка в середину или начало требует сдвига всех последующих элементов, что занимает O(n) времени. Кроме того, при переполнении вектора происходит выделение новой памяти и копирование элементов, что тоже влияет на производительность.

Итог:

  • Для частых вставок в середину или начало лучше использовать list.
  • Для вставок в конец и быстрого доступа по индексу лучше vector.

Пример:

std::list<int> lst = {1, 2, 3};
auto it = std::next(lst.begin());
lst.insert(it, 10); // вставка за O(1)

std::vector<int> vec = {1, 2, 3};
vec.insert(vec.begin() + 1, 10); // вставка за O(n), сдвиг элементов