为什么std :: stack默认使用std :: deque?
由于堆栈中使用的唯一操作是:
为什么它的默认容器是deque而不是vector?
不要deque reallocations在front()之前给出元素的缓冲区,以便push_front()是一种高效的操作? 这些元素是不是浪费了,因为它们永远不会用在堆栈的上下文中?
如果使用这种方式代替矢量没有任何开销,那么为什么priority_queue矢量不是deque也是默认值? (priority_queue需要front(),push_back()和pop_back() - 与堆栈基本相同)
根据以下答案更新:
看来deque通常实现的方式是固定大小数组的可变大小数组。 这使得增长速度比一个向量(需要重新分配和复制)要快,因此对于类似堆栈的增加和删除元素,deque可能是更好的选择。
priority_queue需要大量索引,因为每次删除和插入都需要运行pop_heap()或push_heap()。 这可能会使向量成为更好的选择,因为添加元素仍然是不变的。
随着容器的增长,为矢量重新分配需要将所有元素复制到新的内存块中。 增加一个deque分配一个新块并将其链接到块列表 - 不需要副本。
当然,如果你愿意,你可以指定使用不同的支持容器。 所以,如果你有一个你知道不会增长太多的堆栈,那么告诉它使用一个向量而不是一个deque,如果这是你的偏好。
参见Herb Sutter的第54周的导师了解其中任何一个都可以做到的vector和deque的相对优点。
我想像priority_queue和队列之间的不一致就是不同的人实现它们。
链接地址: http://www.djcxy.com/p/63829.html上一篇: Why does std::stack use std::deque by default?
下一篇: Java Hibernate BUG when using query parameters in order clause