雙端隊列(deque)是一種支持向兩端高效地插入數據、支持隨機訪問的容器。
其內部實現原理如下:
雙端隊列的數據被表示為一個分段數組,容器中的元素分段存放在一個個大小固定的數組中,此外容器還需要維護一個存放這些數組首地址的索引數組,如下圖所示。
由於分段數組的大小是固定的,並且它們的首地址被連續存放在索引數組中,因此可以對其進行隨機訪問,但效率比vector低很多。
向兩端加入新元素時,如果這一端的分段數組未滿,則可以直接加入,如果這一端的分段數組已滿,只需創建新的分段數組,並把該分段數組的地址加入到索引數組中即可。無論哪種情況都不需要對已有元素進行移動,因此在雙端隊列的兩端加入新的元素都具有較高的效率。
當刪除雙端隊列容器兩端的元素時,由於不需要發生元素的移動,效率也是非常高的。
雙端隊列中間插入元素時,需要將插入點到某一端之間的所有元素向容器的這一端移動,因此向中間插入元素的效率較低,而且往往插入位置越靠近中間,效率越低。刪除隊列中元素時,情況也類似,由於被刪除元素到某一端之間的所有元素都要向中間移動,刪除的位置越靠近中間,效率越低。
注意:
在除了首尾兩端的其他地方插入和刪除元素,都將會導致指向deque元素的任何pointers、references、iterators失效。不過,deque的內存重分配優於vector。因為其內部結構顯示不需要復制所有元素。