簡體   English   中英

為什么std :: queue使用std :: dequeue作為底層默認容器?

[英]Why does std::queue use std::dequeue as underlying default container?

正如在cplusplus.com讀到的那樣std::queue實現如下:

隊列實現為容器適配器,它是使用特定容器類的封裝對象作為其底層容器的類,提供一組特定的成員函數來訪問其元素。 元素被推入特定容器的“后面”並從其“前面”彈出。

底層容器可以是標准容器類模板之一或其他一些專門設計的容器類。 該底層容器應至少支持以下操作:

......

標准容器類dequelist滿足這些要求。 默認情況下,如果沒有為特定隊列類實例化指定容器類,則使用標准容器雙端隊列

我很困惑為什么deque (類固醇上的雙端隊列)在這里被用作默認值,而不是list (這是一個雙向鏈表)。

在我看來, std::deque非常過分:它是一個雙端隊列,但也具有恆定時間元素訪問和許多其他功能; 基本上是一個功能齊全的std :: vector bar'元素在內存中連續存儲'保證。

由於普通的std::queue只有很少的可能操作,在我看來,雙向鏈表應該更有效率,因為需要在內部發生的管道要少得多。


那么為什么使用std::deque作為默認值而不是std::list實現std::queue

不要把list想象為“這很難使用,並且缺少一些有用的功能,所以當我不需要這些功能時它必須是最好的選擇”。

list實現為帶有緩存計數的雙向鏈表。 有一小部分情況是最優的; 當你需要真正的,非常強大的引用/指針/迭代器穩定性。 當您在容器中間擦除並插入數量級時,比迭代容器中間的次數更多。

這就是它。

通常實現std數據類型,然后分析它們的性能和其他特性,然后寫出標准“你必須保證這些要求”。 留下了一點擺動的空間。

因此,當他們編寫queue ,有人可能會分析listdeque執行情況,並發現deque速度有多快,因此默認使用deque

在實踐中,有人可以發送具有可怕性能的deque (例如,MSVC具有小塊大小),但是使其比std::list所需的更糟糕將是棘手的。 list基本上要求每個元素一個節點,這會使內存緩存失效。

原因是雙端隊列比列表快幾個數量級。 List分別分配每個元素,而deque分配大塊元素。

list的優點是可以刪除中間的元素,但隊列不需要此功能。

暫無
暫無

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

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