为什么std :: stack默认使用std :: deque?

时间:2008-09-19 14:50:24

标签: c++ stl containers

由于堆栈中使用容器所需的唯一操作是:

  • 背面()
  • 的push_back()
  • pop_back()

为什么默认容器是deque而不是vector?

不要deque重新分配在front()之前给出元素缓冲区,以便push_front()是一个有效的操作吗?这些元素不会浪费,因为它们永远不会在堆栈的上下文中使用吗?

如果没有以这种方式使用双端队列而不是向量的开销,为什么priority_queue的默认值也不是deque的向量? (priority_queue需要front(),push_back()和pop_back() - 基本上与堆栈相同)


根据以下答案进行了更新:

看起来deque通常实现的方式是固定大小数组的可变大小数组。这使得增长速度比矢量(需要重新分配和复制)更快,因此对于类似于添加和删除元素的堆栈之类的东西,deque可能是更好的选择。

priority_queue需要大量索引,因为每次删除和插入都需要运行pop_heap()或push_heap()。这可能使得向量成为一个更好的选择,因为添加元素仍然会以不变的方式分摊。

2 个答案:

答案 0 :(得分:71)

随着容器的增长,向量的重新分配需要将所有元素复制到新的内存块中。增加deque会分配一个新块并将其链接到块列表 - 不需要复制。

当然,如果您愿意,可以指定使用不同的后备容器。因此,如果你有一个你知道不会增长的堆栈,请告诉它使用向量而不是deque,如果这是你的偏好。

答案 1 :(得分:12)

参见Herb Sutter的Guru of the Week 54,了解vector和deque的相对优点。

我认为priority_queue和队列之间的不一致只是不同的人实现了它们。