← Назад к вопросам

Какие плюсы и минусы использования списка?

1.3 Junior🔥 111 комментариев
#STL контейнеры и алгоритмы#Структуры данных и алгоритмы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие плюсы и минусы использования списка?

Плюсы std::list

1. O(1) вставка и удаление в любой позиции

Если есть итератор на позицию, можно вставить/удалить за O(1). Это огромное преимущество перед vector.

2. Стабильные итераторы

Итераторы на другие элементы не инвалидируются при вставке/удалении.

3. O(1) операции в начале и конце

push_front и pop_front работают за O(1), для vector это O(n).

4. Нет переаллокации

Vector требует переаллокацию при росте, list не имеет этой проблемы.

Минусы std::list

1. O(n) random access

Нет operator[], нельзя быстро получить элемент по индексу.

2. Плохая cache locality

Элементы разреженны в памяти, много cache miss'ов.

3. Больше памяти на элемент

Каждый элемент хранит два указателя (prev, next) — overhead 16 байт на 64-bit.

4. Плохо с алгоритмами

std::sort требует random access. Нужно list::sort() на основе слияния.

5. Медленнее на практике

Даже итерация медленнее из-за плохой cache locality, хотя теоретически O(1) на элемент.

Сравнение: list vs vector

Операцияlistvector
Random accessO(n)O(1)
Insert frontO(1)O(n)
Insert middleO(1)O(n)
Push backO(1)O(1)
SortO(n log n)O(n log n)
CacheПлохоОтлично
MemoryВысокий overheadНизкий

Когда использовать list?

Использовать если:

  • Часто вставляешь/удаляешь из начала
  • Часто вставляешь/удаляешь в середину с итератором
  • Нужны стабильные итераторы
  • Не нужен random access

НЕ использовать если:

  • Нужен random access
  • Часто сортируешь
  • Основные операции push_back
  • Memory важна

Практический совет

99% случаев используй vector. Он по умолчанию обычно быстрее. List нужен редко, когда есть специфичные требования по вставкам в начало или середину.

Какие плюсы и минусы использования списка? | PrepBro