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

因为在堆栈中使用容器所需的操作只有:

  • 返回()
  • Push _ back ()
  • Pop _ back ()

为什么它的默认容器是 deque 而不是矢量?

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

如果这样使用 deque 代替向量没有开销,那么为什么  序列优先级的默认值是向量而不是 deque 呢?优先级队列需要 front ()、 push _ back ()和 pop _ back ()——本质上与栈相同


根据以下答案更新:

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

为了完成每次删除和插入操作,都需要运行 pop _ heap ()或 push _ heap ()。这可能使矢量成为一个更好的选择,因为添加一个元素仍然是摊销常数反正。

17312 次浏览

As the container grows, a reallocation for a vector requires copying all the elements into the new block of memory. Growing a deque allocates a new block and links it to the list of blocks - no copies are required.

Of course you can specify that a different backing container be used if you like. So if you have a stack that you know is not going to grow much, tell it to use a vector instead of a deque if that's your preference.

See Herb Sutter's Guru of the Week 54 for the relative merits of vector and deque where either would do.

I imagine the inconsistency between priority_queue and queue is simply that different people implemented them.