《STL源碼剖析》---stl_deque.h閱讀筆記(1)

來源:互聯網
上載者:User

標籤:stl   源碼   deque   雙端隊列   

雙端隊列deque是容器的一種。它比vector更強大,vector只可以在尾端插入元素,deque不只是可以再尾端插入,也可以在隊列頭插入。下面藉助《STL原始碼剖析》的圖片講解。

1、deque的記憶體結構

vector是開闢一段連續的記憶體,deque可以在前端插入元素,如果像vector開闢一段連續的記憶體,向前面插入元素不易維護。例如如果只是開闢一段連續記憶體,那麼前端到開闢記憶體的起始位置要空多少個位置?當這段記憶體滿了時,拷貝到更大記憶體時,前端空留多少位置?顯然難以維護。deque在STL中是維護多個連續記憶體的,多個連續的記憶體不一定連續,一段連續的記憶體叫做緩衝區。STL用一個叫“中控器”的結構map來維護,如:


圖(1)

map是一個指標的指標,它執向一段連續記憶體,這段連續記憶體的內容也是指標,指向緩衝區的起始位置。當map滿了的話,可以擴大map到更大的地方。


2、deque的迭代器deque在記憶體結構上面講過了,那麼deque的迭代器應該是什麼樣子的呢?首先,它應該知道自己在哪個緩衝區。其次,自己在緩衝區哪個位置,在首還是在尾。如果移動出這段緩衝區,那麼應該移動到相鄰的緩衝區,所以迭代器還應該知道自己所在緩衝區在中控器所處的位置。綜上所述,大概可以得出迭代器的樣子,如:
圖(2)迭代器有4個元素,cur指向當前所指的deque結點,first指向迭代器所指結點所在緩衝區的起始位置,last指向迭代器所指結點所在緩衝區的結尾位置,node指向中控器的某個位置,這個位置指向迭代器所指結點所在的緩衝區。
3、deque的操作deque的結構中有兩個重要的迭代器,一個start指向deque的頭,一個finish指向deque尾的下一個位置。如:
圖(3)

當向deque插入/刪除(在頭或者在尾)元素時,如果所操作結點在緩衝區的頭或者尾,都要考慮開闢/釋放緩衝區的問題。

例如,向圖(2)deque末尾插入4個元素0、1、2、3。當插入最後一個元素時,finish迭代器就要移動下一個緩衝區。如:


圖(4)

當向圖(4)deque的頭插入元素99時,也會開闢新的緩衝區。如:


圖(5)

當在首或者尾刪除元素時,可能會涉及緩衝區的釋放,不難想象。


當在deque中間刪除元素時,就會涉及其他元素的移動。deque首尾都可以移動,它會判斷怎麼可以少移動元素,如果刪除位元置距離頭更近,它會把前面的元素向後移;反之,把後面元素向前移。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.