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

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

  • 背部()
  • 推回()
  • pop_back()

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

不要deque reallocations在front()之前给出一个元素的缓冲区,这样push_front()是一个高效的操作? 这些元素是不是浪费了,因为他们永远不会在堆栈的情况下使用?

如果使用这种方式代替vector没有任何开销,为什么priority_queuevector的默认值也不是一个deque? (priority_queue需要front(),push_back()和pop_back() – 与堆栈基本相同)


根据下面的答案更新:

看来deque通常被实现的方式是固定大小数组的可变大小的数组。 这使得增长速度比一个向量(需要重新分配和复制)要快,所以对于像堆栈这样的东西来说,添加和删除元素,deque可能是更好的select。

priority_queue需要大量索引,因为每个删除和插入都需要运行pop_heap()或push_heap()。 这可能会使向量成为更好的select,因为添加元素仍然是不变的。

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

当然,你可以指定一个不同的支持容器,如果你喜欢的话。 所以,如果你有一个堆栈,你知道不会增长太多,如果这是你的偏好,告诉它使用一个vector,而不是一个双峰。

请参阅本周第54周的“药剂师的上师”,了解向量和德克的相对优点。

我想,priority_queue和queue之间的不一致就是不同的人实现它们。