STL-學習筆記:順序容器之deque

vector 和 deque的區別?

1、vector是單向開口的連續線性空間,deque是一種雙向開口的連續線性空間。

2、deque 允許常數時間內對頭端進行元素的插入和刪除操作。而vector在頭端操作效率超級差。

3、deque沒有容量觀念。因爲deque是動態地分段連續空間組合而成,隨時可以增加一段新的空間並鏈接起來。


deque迭代器:並不是普通指針.


deque 基礎知識。

deque 由一段一段的定量連續空間組成,採用一塊所謂的map作爲主控(並不是平時使用的map), map 是一小塊連續的空間。deque 本身要維護指向map的指針,以及start,finish兩個個迭代器,分別指向第一個緩衝區的第一個元素 和最後一個緩衝區的最後一個元素的下一個位置。

map中的每個節點是一個指針,指向一個特定大小的緩衝區,緩衝區裏面存放的就是deque中的元素。在使用過程中,如果map提供的節點不足,就必須重新配置一塊更大的map。


當deque調用push_back時,內部是怎樣實現的?

如果當前的最後一個緩衝區的剩餘備用空間大於一個元素時,則直接插入元素,當只剩一個元素的位置時,並且當前map的最後一個結點後面還有剩餘的備用結點時,會先配置一整塊新的緩衝區,map的下一個結點指向該緩衝區,插入新的元素, 最後更改finish的狀態。


當調用push_front時,內部是如何實現的?

如果當前的第一個緩衝區前面有備用空間,就直接插入元素,與push_back不同的是,當沒有任何備用空間時,纔會衝刺你配置一整塊新的緩衝區,並將map的已用結點前面的結點設置爲指向新緩衝區的地址,新的元素放在新緩衝區的最後一個元素的位置上,最後更改start的狀態。


以上兩個方法都認爲map的空間足夠的情況,當map的空間已經不夠時,要重新分配一個更大的,新的連續的空間作爲新的map,並將舊map裏面的內容全部複製到新的map中,同時更改start 和 finish,並將舊map的空間釋放,然後再進行如上的push_back 和push_front 的相應內部操作。


當deque調用pop_back 和 pop_front時,要考慮在某種條件下,將一整塊緩衝區全部釋放掉。

當deque調用clear()時,由於deque的最初狀態是僅有一個緩衝區,所以clear()之後,deque會恢復到最初的狀態,即保留一個緩衝區。

注意:stack的內部是由deque實現的,只是更改了接口,形成另外一種風貌,就是“先進先出” 的棧式操作,所以stack沒有迭代器,也不能對裏面的所有元素進行遍歷操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章