![](/img/trans.png)
[英]Why std::queue doesn't implement insert() while std::deque does?
[英]Why doesn't std::deque allow specifying the bucket size?
std::deque
將元素存儲在固定大小的“桶”(數組)中。 不同的編譯器使用不同的桶大小:
element_size < 256 ? 4096 : element_size * 16
element_size < 256 ? 4096 : element_size * 16
對於MSVC(尤其是)和GCC,如果deque元素大小大於硬編碼大小,則std::deque
會變成一個復雜的std::list
,在大多數情況下會有性能損失。
在我看來,Clang做得更好,無論deque元素的大小如何,桶都至少有16個元素。 盡管4096字節的最小桶大小在某些情況下對於小元素可能是次優的。
為什么std::deque
沒有額外的模板參數用於存儲桶大小,默認值是供應商認為合理的? 這不會破壞向后兼容性,但會允許性能優化。
deque
就像一個黑盒子。 沒有具體說明它是如何實現的。 該實現可以自由使用它喜歡的任何技術以符合性能要求。 因此,它不能將桶大小作為模板參數。
當然,這種數據結構很有用。 標准可以選擇提供它(在名稱deque
或作為新容器),但他們沒有。 相反, unordered_*
容器保證使用桶。 每[unord.req] / 9 :
無序關聯容器的元素被組織成桶 。 具有相同哈希碼的密鑰出現在同一個存儲桶中。 當元素添加到無序關聯容器時,桶的數量會自動增加,因此每個桶的平均元素數量保持在一個邊界之下。 重新散列使迭代器無效,元素之間的順序更改以及桶元素出現的更改,但不會使指針或對元素的引用無效。 對於
unordered_multiset
和unordered_multimap
,rehashing保留了等效元素的相對順序。
deque
沒有類似的措辭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.