Ответ
std::deque (double-ended queue, дек) — это контейнер стандартной библиотеки C++, который обеспечивает эффективную вставку и удаление элементов как в начало, так и в конец за амортизированное O(1).
Ключевые особенности и отличия от std::vector:
| Особенность | std::deque |
std::vector |
|---|---|---|
| Вставка в начало | O(1) (амортизир.) | O(n) (сдвиг всех элементов) |
| Расположение в памяти | Не гарантирует непрерывность (блочная структура) | Гарантирует непрерывность |
| Инвалидация указателей/итераторов | При модификации инвалидируются все итераторы, указатели/ссылки на элементы — нет (кроме удалённого элемента) | При любом изменении ёмкости инвалидируются все итераторы, указатели и ссылки |
Пример использования:
#include <deque>
#include <iostream>
#include <algorithm> // for std::copy
int main() {
std::deque<int> dq = {2, 3, 4};
// Эффективная вставка с двух сторон
dq.push_front(1); // dq: [1, 2, 3, 4]
dq.push_back(5); // dq: [1, 2, 3, 4, 5]
// Прямой доступ по индексу за O(1)
std::cout << "Element at index 2: " << dq[2] << 'n'; // Выведет: 3
// Итерация
for (const auto& elem : dq) {
std::cout << elem << ' ';
}
// Выведет: 1 2 3 4 5
// Типичный use-case: реализация очереди с возможностью "заглянуть" в начало и конец
// или скользящего окна (sliding window).
return 0;
}
Внутренняя реализация: Обычно реализуется как массив указателей на фиксированные блоки памяти. Это компромисс, дающий быстрые операции с концами, но делающий произвольный доступ и итерацию чуть медленнее, чем у вектора, из-за дополниного уровня косвенности.
Когда использовать: Когда нужна очередь (std::queue по умолчанию использует deque) или требуется часто добавлять/удалять элементы с обоих концов, при этом не критична непрерывность данных в памяти.
Видео-ответы
▶
▶
▶
▶
▶