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

Можете объяснить отличия между контейнерами std::deque и std::list в C++?

Компании, где спрашивали
Финам

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

sobes.tech AI

std::deque (double-ended queue) и std::list — это два разных контейнера в C++, предназначенных для хранения последовательностей элементов, но с разной внутренней организацией и характеристиками.

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

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

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

Характеристика std::deque std::list
Внутренняя структура Массив блоков Двусвязный список
Доступ по индексу Быстрый (O(1)) Медленный (O(n))
Вставка/удаление Быстрая на концах, медленная в середине Быстрая в любом месте (при наличии итератора)
Использование памяти Более компактный Дополнительная память на указатели

Пример:

#include <iostream>
#include <deque>
#include <list>

int main() {
    std::deque<int> d = {1, 2, 3};
    d.push_front(0); // Быстрое добавление в начало
    std::cout << "deque[2]: " << d[2] << "\n"; // Быстрый доступ по индексу

    std::list<int> l = {1, 2, 3};
    auto it = l.begin();
    std::advance(it, 1);
    l.insert(it, 10); // Быстрая вставка в середину

    for (int x : l) std::cout << x << " ";
}

Выбор зависит от задачи: если нужен быстрый произвольный доступ и операции на концах — deque, если важна быстрая вставка/удаление в середине — list.