簡體   English   中英

為什么std :: stack默認使用std :: deque?

[英]Why does std::stack use std::deque by default?

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

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

為什么它的默認容器是deque而不是vector?

不要deque重新分配在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和隊列之間的不一致只是不同的人實現了它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM