为什么默认情况下std :: stack使用std :: deque?
时间:2020-03-06 14:26:17 来源:igfitidea点击:
由于要在堆栈中使用容器的唯一操作是:
- 背部()
- 推回()
- pop_back()
为什么默认容器是双端队列而不是向量?
难道双端队列重分配不会在front()之前提供元素的缓冲区,以便push_front()是有效的操作?这些元素不会浪费,因为它们永远不会在堆栈的上下文中使用吗?
如果没有用这种方式使用双端队列代替向量的开销,为什么priority_queue的默认向量也不是双端队列? (priority_queue要求front(),push_back()和pop_back()与堆栈基本相同)
根据以下答案进行了更新:
似乎双端队列通常实现的方式是固定大小数组的可变大小数组。这使得增长速度快于向量(需要重新分配和复制)的增长,因此对于像堆栈这样的所有元素而言,添加和删除元素都是可行的,双端队列可能是更好的选择。
由于每次删除和插入操作都需要运行pop_heap()或者push_heap(),所以priority_queue需要大量索引。因为添加元素无论如何仍会摊销常量,所以这可能使vector成为更好的选择。
解决方案
随着容器的增长,向量的重新分配需要将所有元素复制到新的内存块中。增大双端队列会分配一个新块并将其链接到不需要复制的块列表。
当然,我们可以根据需要指定使用其他支持容器。因此,如果我们知道自己的堆栈不会增长太多,那么请告诉它使用向量而不是双端队列。
有关vector和deque的相对优点,请参见Herb Sutter的" 54周专家"。
我认为priority_queue和queue之间的不一致仅仅是因为不同的人实现了它们。