[英]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.