Middle
136
questionbank

Какова сложность операций для контейнеров std::vector и std::list в C++?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Частные случаи могут зависеть от реализации, но для стандартных контейнеров сложность операций выглядит следующим образом:

std::vector

ОперацияСредняя сложностьХудшая сложностьПримечание
Доступ по индексуO(1)O(1)operator[], at()
Вставка в конецO(1) амортизированнаяO(N)push_back() (при необходимости перераспределения)
Вставка в произвольное местоO(N)O(N)
Удаление с концаO(1)O(1)pop_back()
Удаление из произвольного местаO(N)O(N)
Поиск элементаO(N)O(N)std::find (независимо от контейнера)
Изменение размераO(N)O(N)resize(), reserve() (при увеличении емкости)

std::list

ОперацияСредняя сложностьХудшая сложностьПримечание
Доступ по индексуO(N)O(N)Требует итерации от начала или конца к нужному элементу
Вставка в конецO(1)O(1)
Вставка в произвольное местоO(1)O(1)При наличии итератора на место вставки
Удаление с концаO(1)O(1)
Удаление из произвольного местаO(1)O(1)При наличии итератора на удаляемый элемент
Поиск элементаO(N)O(N)std::find (независимо от контейнера)

Основные отличия:

  • std::vector обеспечивает эффективный доступ по индексу и к последнему элементу, но вставка/удаление в середине требуют перемещения элементов.
  • std::list обеспечивает эффективную вставку/удаление в любой позиции (при наличии итератора), но доступ по индексу дорог. Он является двусвязным списком.

Пример использования:

cpp