簡體   English   中英

為什么std :: deque子陣列大小是固定的?

[英]Why are std::deque subarray sizes fixed?

背景

std::deque使用子數組來存儲其元素。 它有一個額外的簿記數據結構,以跟蹤其子陣列。 這樣,與std::vector相比, std::deque可以從后面更快地增長(O(1)與分攤的O(1)相比),並且在前面更快(O(1)與O(n)相比))。 這是因為std::deque只能在兩端添加一個子數組,只需要修改其簿記數據結構。


我不明白的是,為什么子陣列有自己的尺寸固定為解釋在這里

典型的實現使用一系列單獨分配的固定大小的數組

沒有固定大小的子陣列有很多優點。 例如,由於子陣列的大小是固定的,因此中間的任何插入都必須是O(n)復雜度,其中n是最近端的元素數。 但是,如果子陣列可以自由增長,則在中間插入將是O(k),其中k是子陣列中元素的數量,這要快得多,特別是如果std::deque有很多子陣列。 從中間刪除也是一樣的。

是因為std::deque想要保持其子陣列平衡嗎? 如果子陣列太大/太小,則可以通過啟用子陣列進行拆分或合並來輕松減輕這種情況。 復雜性將只是O(k),其中k是最大子陣列的大小。 (或者最小的子陣列和它的較小鄰居的組合大小)

是因為固定大小的子陣列使得隨機迭代更快嗎? 例如,如果你想要第n個元素,你必須通過簿記數據結構並添加所有先前子陣列的大小,使得復雜度為O(k),其中k是簿記數據結構的大小。 但這並不是一個大問題,因為std::deque被廣告宣傳為雙向鏈表,無論如何都有更好的緩存。


編輯: std::deque只是鏈表實現和數組實現之間的中間人。 我想我的問題已經失去了它的原始含義,只是暗示它應該表現得更像鏈接列表而不是矢量

我不明白的是為什么子陣列的大小是固定的

因為這允許標准所要求的恆定復雜性隨機訪問,如評論中所指出的那樣。


但這不是一個大問題

我不同意,大概是標准委員會也是如此。

因為std::deque被宣傳為雙重鏈接列表......

這不是廣告。

暫無
暫無

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

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