Почему 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!)