《STL原始碼解析》讀書筆記之序列式容器(2)

2021-06-28 23:24:51 字數 2228 閱讀 8190

1.deque

deque和vector的最大差異在於deque允許在常數時間內對首端進行元素的插入和刪除操作。而且deque沒有容量的觀念,因為它是動態地以分段連續空間組合而成的,隨時可以增加一段新的空間並鏈結起來。像vector那樣因舊空間不足而重新配置一塊更大空間的情況在deque裡是不會發生的。雖然deque也提供random access iterator,但它的迭代器並不是普通指標,這影響了很多操作的效率。

(1)deque的map

deque在邏輯上是連續空間,但實際上它是由一段一段的定量連續空間構成。一旦有必要在deuqe的前端或尾端增加新空間,便配置一段定量的連續空間,串接在整個deque的頭端或尾端。deque的最大任務,就是在這些分段的定量連續空間上,維護其整體連續的假象,並提供隨機訪問的介面。這樣避免了vector「重新申請記憶體、複製、釋放」的輪迴,代價則是複雜的迭代器架構。

deque採用一塊所謂的map作為主控。這裡所謂map是一小塊連續空間。其中每乙個元素都是指標,指向另一段較大的連續空間,稱為緩衝區。緩衝區才是deque的儲存主體。stl允許我們指定緩衝區大小,如果不指定則預設使用512bytes緩衝區。

deque的定義:

deque裡面定義的map物件其實是乙個t**,也就是說它是乙個指標,所指之物又是乙個指標,指向型別為t的一塊空間,如下圖所示:

(2)deque的迭代器

deque是分段連續空間。維持其「整體連續」假象的任務,落在了迭代器的operator++和operator--兩個運運算元身上。deque迭代器的資料結構設計如下:

假設現在有乙個deque,並令其緩衝區大小為32。經某些操作後deque擁有20個元素。每個int佔4位元組空間,則每個緩衝區可以存8個int。20個int將占用3個緩衝區,其中第三個快取區將還剩餘16bytes的剩餘空間。此時deque的記憶體使用情況如下:

由於deque特殊的記憶體結構,當進行指標操作,遇到緩衝區邊緣時,要特別注意,有的時候可能需要跳到另外乙個緩衝區(實現參考《stl原始碼解析》148頁)。

(3)deque的資料結構

deque除了維護乙個先前說過的map的指標外,也維護start,finish兩個迭代器,分別指向第乙個緩衝區的第乙個元素和最後乙個快取區的最後乙個元素。此外,它也應該記住當前map的大小。因為map所提供的節點不足,就必須重新配置更大的一塊map。

stack是一種先進後出的資料結構。它只有乙個出口。stack允許新增元素,移除元素,取得頂端元素。但除了頂端外,沒有其他任何方法可以訪問stack的其它元素。

deque是雙向開口的資料結構,以deque為底部結構並封閉其頭端開口,便可形成乙個stack。

stack是以deque為底部容器完成其所有工作,像stack這種「修改某物介面,形成另一種風貌」的類被稱為adapter。其源**如下:

queue是一種先進先出的資料結構。它有兩個出口,允許從最底端加入元素,從最頂端取得元素。但除此之外,沒有其他任何方法可以訪問queue中的元素。和用deque生成stack的原理一樣,deque經過封裝之後一樣也可以生成stack。其源**如下:

STL原始碼剖析讀書筆記

一.stl提供六大元件,彼此可以組合套用。1.容器 containers 各種儲存結構,如vector list deque set map,用來存放資料。2.演算法 algorithme 各種常用演算法,如sort search copy erase等。3.迭代器 iterators 扮演容器與演...

STL原始碼剖析讀書筆記之vector

stl原始碼剖析讀書筆記之vector 1.vector概述 vector是一種序列式容器,我的理解是vector就像陣列。但是陣列有乙個很大的問題就是當我們分配 乙個一定大小的陣列的時候,起初 也許我們不會覺得陣列容量太小不合需求,但是隨著資料量的增加,陣列尺寸 大小不再滿足需求,此時我們需要手動...

stl原始碼剖析讀書筆記之allocator

第二章開始作者定義了乙個簡單的模板類jj allocator,有allocator的所有介面,包括allocator deallocate construct destroy 四個成員函式 但是開啟 stl原始碼中的stl alloc.h,sgi stl用的最多的std alloc並沒有constr...