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

时间:2013-02-10 00:03:32

标签: c++ vector stl deque

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

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

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

为了在插入期间最小化移位,要移位的包含值将取决于插入点。如果在n之前插入索引size()/2,请将值向左移动n。否则在n之后向右移动值。

我想念的是什么,以至于deque是一组价值数组而不是一个大数组呢?

1 个答案:

答案 0 :(得分:8)

According to Wikipedia,你所描述的确实是一种可能的实现,至少在一般情况下是这样。

但是,C ++标准强制要求基本上禁止将其作为std::deque的实现; [deque.modifiers]声明:

  

在双端队列的两端插入......对双端队列元素的引用的有效性没有影响。

(感谢@BenjaminLindley!)