为什么std::deque不是一个在索引0之前保留内存的向量

Why is std::deque not a vector with memory reserved before index 0?

本文关键字:索引 保留内存 向量 一个 deque std 为什么      更新时间:2023-10-16

据我所知,deque背后的动机是提供一个具有高效push_front的随机访问容器。

与deque相比,vector的常见优点包括更快的遍历和at(),但主要是它的C兼容性,因为它保证了连续内存。Deque没有,因为它是内存块的集合,每个内存块都包含多个值。

我很困惑。为什么deque不是像向量一样构建的,而是除了在索引size-1之后保留的内存之外,还在索引0之前保留的内存?这将保证连续的内存,启用高效的push_front,甚至在解引用迭代器时避免额外的间接性。

为了最大限度地减少插入过程中的偏移,要偏移的包含值将取决于插入点。如果在size()/2之前的索引n处插入,则将值向左移动至n。否则,将n之后的值右移。

我错过了什么,以至于deque是一个值数组的集合,而不是一个大数组?

根据维基百科,您所描述的实际上是一种可能的实现,至少在一般情况下是这样。

然而,C++标准提出了一些要求,基本上禁止将其作为std::deque的实现;[deque.modifiers]状态:

在deque的两端插入。。。对引用deque元素的有效性没有影响。

(感谢@BenjaminLindley!)