特性
deque
是雙端隊列不規則的首字母縮寫,雙端隊列是動態大小的序列式容器,其可以向兩端進行伸縮。- 特定的庫可以以不同的方式實現
deque
,但通常都是一種動態數組。不論在何種情況下,它都允許通過隨機訪問迭代器直接訪問單個元素,可以根據需要動態的伸縮。 - 因此,
deque
提供了一些與vector
相似的功能,但deque
在頭部和尾部進行數據插入和刪除操作更加高效。
與vector
不同的是,deque
不能保證所有的元素存儲在連續的空間中,在deque
中通過指針 + 偏移量方式訪問元素可能會導致非法的操作。 vector
與list
提供了相似的接口,因此其具有類似的用途,但是內部的實現原理不同:
vector
使用使用了動態數組,該數組通常需要動態增長;
deque
中的元素可能分散在不同的存儲塊中,在deque
中保存了一些必要的信息,通常用來在常數範圍內直接訪問deque
中的任何一個元素,所以deque
的內部實現比vector
複雜,但是這些額外信息使得deque
在某些情況下增長更加的高效,特別是在序列比較大,重新分配成本比較高的情況下。- 除了在頻繁在頭部或尾部進行插入和刪除操作外,
deque
比list
和forward_list
的性能更差。
迭代器
雙端隊列底層是一段假想的連續空間,實際是分段連續的,爲了維護其“整體連續”的假象,落在了deque
的迭代器身上。
下圖爲deque的原理圖:
從下到上的方格依次是:迭代器,中控器,緩衝區。
deque::begin()
返回迭代器的start
,deque::end()
返回迭代器的finish
,這兩個迭代器都是deque
的data member
。
它就是一個靠中控映射實現的結構。
小結
deque
在序列式容器中出現場景比較少,因爲:
- 如果只是簡單的存儲元素,使用
vector
即可 - 如果對元素任意位置進行插入或者刪除操作比較多,使用
list
即可
deque
最大的應用:用其作爲標準庫中stack
和queue
的底層結構。