Почему std::deque не является вектором с памятью, зарезервированной до индекса 0?

Насколько я понимаю, мотивация deque заключается в предоставлении контейнера с произвольным доступом с эффективным push_front,

Обычно цитируемые преимущества вектора по сравнению с deque включают более быстрый обход и at(), но в основном его совместимость с C, так как он гарантирует непрерывную память. Deque этого не делает, поскольку это набор фрагментов памяти, каждый из которых содержит несколько значений.

Я не совсем понимаю. Почему не deque построен как вектор, а память зарезервирована до индекса 0 в дополнение к памяти, зарезервированной после индекса size-1? Это гарантировало бы непрерывную память, позволяя эффективно push_front и даже избежать дополнительной косвенности при разыменовании итераторов.

Чтобы минимизировать смещение во время вставки, содержащиеся в нем значения будут зависеть от точки вставки. Если вставить в индекс n быть до size()/2, сдвиньте значения до n оставил. В противном случае сдвиг вправо значения после n,

Что я упустил, что так важно, что deque - это набор массивов значений, а не один большой массив?

1 ответ

Решение

Согласно Википедии, то, что вы описываете, действительно является одной из возможных реализаций, по крайней мере, в целом.

Однако стандарт C++ налагает требования, которые по существу запрещают это как реализацию для std::deque; [deque.modifiers] сообщает:

Вставка в любом конце deque ... не влияет на достоверность ссылок на элементы deque.

(Спасибо @BenjaminLindley!)

Другие вопросы по тегам