C 序列式容器(三) deque

2021-10-03 20:08:33 字數 858 閱讀 1017

deque是雙向開口的連續線性空間,可以在頭尾兩端分別做插入和刪除操作。主要維護了一塊map(不是stl的map)作為主控。map是一小塊連續空間,每個節點都指向另一段連續性空間,也稱緩衝區。該緩衝區即是儲存空間主體。當map滿載,則會分配更大的空間作為map。其主要結構體如下:

class deque
記憶體結構如下圖:

迭代器主要儲存了四個指標:

cur 指向當前緩衝區的某個元素

first 指向當前緩衝區的頭節點

last 指向當前緩衝區的尾節點

node 指向緩衝區對應的map節點

支援了乙個方法set_node可以跳緩衝區,該方法重新指定node,first和last。當在頭節點自減或者在尾節點自增的時候,會通過set_node跳到另乙個緩衝區,並指定cur指標。

初始化的時候會計算map長度和填充資料所占用map長度,盡量在map中間展開,從而使兩邊的擴充空間一樣大。

finish指向最後乙個空閒節點,尾端插入的時候,如果剛好是緩衝區的最後乙個備用節點,會在map後端分配新節點,設定插入的值,並改變finish迭代器的指標指向新緩衝區的頭節點。

往後插入節點,如果只剩乙個備用節點的時候,會判斷一次map是否擴容。方法如下:

void reserve_map_at_back(size_type nodes_to_add=1)
從前端插入的處理邏輯類似。

在中間插入或移除節點的時候,會判定節點前後的資料長度,按少的一端去做元素移動,因此越靠近中間段的資料變更,效率也越低。

STL中序列式容器之三deque

1.deque概述 vector是單向開口的連續線性空間,而deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端都可以做元素的插入與刪除操作。vector當然也可以在頭尾兩端進行操作 從技術觀點 但是其頭部操作其差,無法被接受。deque和vector的最大差異,一在於deq...

STL序列式容器之deque

deque是一種雙向開口的連續線性空間,所謂雙向是指可以在首尾兩端進行插入和刪除,邏輯結構如圖所示 deque和vector最大的差異在於deque可以在常數時間內對頭端進行插入和刪除操作,而且deque沒有容量的概念,隨時可以增加一段新的空間並鏈結起來。除非必要,應盡量使用vector而非dequ...

STL序列式容器之deque

deque概述 vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作。vector當然也可以在頭尾兩端分別做元素的插入刪除操作 從技術上說 但是其頭部操作效率極差而無法被接受。deque和vector的最大差異,...