Реализация deque
должна обеспечивать
- произвольный доступ к его элементам в постоянном времени
- постоянное время вставки и удаления в конце
- постоянное время вставки и удаления в начале
(1) исключает любые виды связанных списков, включая циклические списки
(2) & (3) исключают простой кусок памяти, в котором хранятся элементы.
ПРИМЕЧАНИЕ: действующий стандарт ('03) действительно гласит постоянное время , а не амортизированное постоянное время для (2) и (3) (см. 23.2.1/1
), однако я думаю, что это упущение. Я не знаю, как сделать все три в постоянное время . Если это только постоянное время для (1) и постоянное время амортизации для (2) и (3), то это довольно просто.
AFAIK MSVC deque
использует кольцевой буфер указателей на страницы элементов. Думайте о кольцевом буфере как о массиве (vector
) со смещением + циклический переход. А страница содержит небольшое количество элементов (IIRC не более 8), в зависимости от sizeof(element)
. Кольцевой буфер увеличивается как std::vector
, если требуется больше места (и именно здесь вам нужно амортизированное постоянное время вместо постоянное время ).
Я думаю, что другие реализации (GCC, ...) будут очень похожи.
Кстати: в стандарте также есть пункт, который делает невозможным использование только одного большого кольцевого буфера элементов без «указателя указателя». 23.2.1.3/1
говорит, что вставка в начале или конце не делает недействительными ссылки на элементы в deque
. Понятно, что это невозможно, если структура, содержащая сами элементы, должна быть перераспределена, когда она выходит за пределы зарезервированного пространства. Это потребует простой кольцевой буфер, поэтому его нельзя использовать.