STL原始碼剖析 第4章 序列式容器

2021-08-01 18:43:55 字數 2352 閱讀 7281

vector的迭代器只是乙個指標,因為空間連續,所有的++,–操作都有了,不需要新建型別來過載

雙向鍊錶

list空間不連續,沒法直接進行指標的++,–來達到前乙個後乙個元素,所以必須設計iterator類,過載++,–,以及operator*(),統一成類指標形式

在position處連續插入n個值為x的物件insert(position, n, x)

主要精髓是用了迭代器來做一層封裝,迭代器重載了++,–等運算子

1) 在外層看來,用迭代器進行++就能遍歷整個deque空間

2) 在內部實現,用了兩個迭代器,start 和 finish,

真正的元素資料就存放在[start.cur,finish.cur)之間

其中,每個迭代器維護了4個指標, cur, first, last, node

其中 指標

含義cur指向實際的資料記憶體位置

[first,last)node指向了map,型別為t**,*node表示元素資料快取區的起始位址,node本身在map段裡是連續的,可以直接++,–

這樣在使用者寫程式的時候,構造乙個迭代器,在迭代器start和finish範圍內遍歷,實際上就是利用構造的迭代器的cur指標,在[start.cur, finish.cur),這樣就能遍歷所有deque空間的元素,使用者看起來像是和用vector一樣一段連續的空間;

這種遍歷,通過對迭代器類過載==, !=來實現,比較迭代器的cur指標是否相同,比如判斷是否超出最後乙個元素,可以判斷user_ite.cur == finish.cur,如果相等則表示確實到達了最後乙個元素的下乙個元素位置。

4.4.2.1 creat_map_and_nodes

creat_map_and_nodes(size_type num_elements)

引數解析,num_elements表示deque要儲存的元素個數

其中node在map居中放置,兩端預留空間,如上圖map所示,黑節點居中放置

4.4.2.2 reserve_map_at_back

判斷map空間是否不足,不足的話換一張新的map,將原來的map裡的內容複製到新map的居中位置,同樣保留兩端的預留空間,然後重新設定迭代器first,和finish,使之和新map對應

iterator _m_reserve_elements_at_back(size_type __n)
4.4.2.3 reallocate_map

reserve_map_at_back內部判斷出後端的map備用空間不夠用時,會呼叫reallocate_map函式

後端map備用空間滿足不了使用者要求的nodes_to_add個預留空間的需求,但是map還是可能能容納增加了預留個數的node節點,因為左邊可能很空,整體變得很偏右側,只要調整居中即可,這就是if的由來

其實就是多增加乙個元素,然後用前移或者後移覆蓋,然後再對指定位置處的元素賦值

不作為乙個容器,而作為乙個配接器,本身沒有迭代器

不作為乙個容器,而作為乙個配接器,本身沒有迭代器

不作為乙個容器,只是作為演算法,這樣隱式的存在,需要配合vector使用

floyd建堆:

總體思想,通過乙個節點將兩個現有堆進行合併,合成為乙個堆

通過根節點連線兩個堆,然後對根節點進行下濾調整,使堆合法

實際上,需要從最後乙個節點的父節點開始,從後往前,將左右子堆合併,直到根節點,這樣,其合併的複雜度為堆中各節點的高度之和,效率為o(

n),鄧俊輝《資料結構》書上有詳解

template

void

__make_heap(_randomaccessiterator __first,

_randomaccessiterator __last, _tp*, _distance*)

}

跟heap差不多,主要增加了可以選擇構造大頂堆還是小頂堆

不是stl的標準

單向鍊錶,只能從前往後走

end()返回的迭代器永遠指向0

《STL原始碼剖析》 序列式容器

stl原始碼剖析 前言 所謂的序列式容器,其中的元素都可序,但未必有序,c 本身提供了乙個序列式容器array,stl 提供了vector,list,deque,srack,queue,priority queue等 一.使用reverse 函式提前設定容量大小 1.1 提前設定的原因 對於vect...

STL原始碼剖析之序列式容器

最近由於找工作需要,準備深入學習一下stl原始碼,我看的是侯捷所著的 stl原始碼剖析 之所以看這本書主要是由於我過去曾經接觸過一些台灣人,我一直覺得台灣人非常不錯 這裡不涉及任何政治,僅限個人感受 在技術上他們比較嚴謹,在為人處世上也非常謙虛,所以一些台灣的技術資料我覺得是值得一看的。想要學習st...

STL原始碼剖析 序列式容器之deque

deque概述 deque是一種雙開口的連續線性空間,可以在頭尾兩端分別做元素的插入和刪除操作 deque沒有容量的概念,它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈結起來 deque的中控器 deque由一段一段的定量連續空間構成 一旦有必要在deque前端或尾端增加新空間,便配...