代码之家  ›  专栏  ›  技术社区  ›  Greg Rogers

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

  •  78
  • Greg Rogers  · 技术社区  · 17 年前

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

    • 后退()
    • PurthBook()
    • POPYBACK()

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

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

    如果使用deque代替vector没有开销,为什么优先级队列vector的默认值不是deque?(priority_queue需要front()、push_back()和pop_back()-基本上与stack相同)


    根据以下答案更新:

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

    优先级_队列需要大量索引,因为每次删除和插入都需要运行pop_heap()或push_heap()。这可能使向量成为更好的选择,因为添加元素仍然是摊销常数。

    2 回复  |  直到 17 年前
        1
  •  70
  •   Michael Burr    17 年前

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

    当然,如果您愿意的话,可以指定使用不同的支持容器。所以如果你有一个你知道不会增长很多的堆栈,告诉它使用一个向量而不是一个deque,如果这是你的偏好。

        2
  •  12
  •   James Hopkin    16 年前

    见Herb Sutter的 Guru of the Week 54 对于向量和deque的相对优点,两者都可以做到。

    我认为优先级队列和队列之间的不一致仅仅是不同的人实现了它们。