Deque 簡介
deque是 「double—ended queue」 的縮寫,和vector一樣都是STL的容器,deque 是雙端數組,而 vector 是單端的。
deque 在接口上和 vector 非常相似,在許多操作的地方可以直接替換。deque 可以隨機存取元素(支持索引值直接存取,用[]操作符或at()方法,這個等下會詳講)。
deque 頭部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比較費時。
使用時需要包含頭文件 #include<deque> 。
Deque 實現原理
deque 的中控器
deque是連續空間(至少邏輯上看來如此),連續線性空間總令我們聯想到array或vector。
array無法成長,vector雖可成長,卻只能向尾端成長,而且其所謂的成長原是個假象,事實上是(1)另覓更大空間;(2)將原數據複製過去;(3)釋放原空間三部曲。如果不是vector每次配置新空間時都有留下一些餘裕,其成長假象所帶來的代價將是相當高昂。
deque系由一段一段的定量連續空間構成。一旦有必要在deque的前端或尾端增加新空間,便配置一段定量連續空間,串接在整個deque的頭端或尾端。
deque的最大任務,便是在這些分段的定量連續空間上,維護其整體連續的假象,並提供隨機存取的接口。避開了「重新配置、複製、釋放」的輪迴,代價則是複雜的迭代器架構。
受到分段連續線性空間的字面影響,我們可能以為deque的實現複雜度和vector相比雖不中亦不遠矣,其實不然。
主要因為,既是分段連續線性空間,就必須有中央控制,而為了維持整體連續的假象,數據結構的設計及迭代器前進後退等操作都頗為繁瑣。deque的實現代碼分量遠比vector或list都多得多。
deque採用一塊所謂的map(注意,不是STL的map容器)作為主控。
這裡所謂map是一小塊連續空間,其中每個元素(此處稱為一個節點,node)都是指針,指向另一段(較大的)連續線性空間,稱為緩衝區。
緩衝區才是 deque 的儲存空間主體。SGI STL 允許我們指定緩衝區大小,默認值0表示將使用512 bytes 緩衝區。
deque 的整體架構如下圖所示:
deque 的迭代器
讓我們思考一下,deque的迭代器應該具備什麼結構,首先,它必須能夠指出分段連續空間(亦即緩衝區)在哪裡,其次它必須能夠判斷自己是否已經處於其所在緩衝區的邊緣。
如果是,一旦前進或後退就必須跳躍至下一個或上一個緩衝區。為了能夠正確跳躍,deque必須隨時掌握管控中心(map)。
所以在迭代器中需要定義:當前元素的指針,當前元素所在緩衝區的起始指針,當前元素所在緩衝區的尾指針,指向map中指向所在緩區地址的指針,分別為cur, first, last, node。
指針結構如下圖所示:
————————————————
版權聲明:本文為CSDN博主「ChrisYoung1314」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/baidu_28312631/article/details/48000123
-- END --
進技術交流群,掃碼添加我的微信:Byte-Flow
獲取視頻教程和源碼
推薦:
面試常問的 C/C++ 問題,你能答上來幾個?
C++ 面試必問:深入理解虛函數表
很多人搞不清 C++ 中的 delete 和 delete[ ] 的區別
看懂別人的代碼,總得懂點 C++ lambda 表達式吧
Java、C++ 內存模型都不知道,還敢說自己是高級工程師?
C++ std::thread 必須要熟悉的幾個知識點
現代 C++ 並發編程基礎
現代 C++ 智能指針使用入門
c++ thread join 和 detach 到底有什麼區別?
C++ 面試八股文:list、vector、deque 比較