STL原始碼剖析 序列式容器心得筆記

2022-07-10 18:18:07 字數 983 閱讀 2348

序列式容器包括array(c++內建),vector,heap,priority_queue,list,slist,deque,stack,queue.

其中stack和queue只是將deque簡單的封裝一下,技術上被稱為配接器.

我理解的vector是乙個單口的水杯,杯的深度代表vector的容量capacity,而水的深度代表vector的大小size.

正因為他是單口的所以在末尾新增push_back()和刪除pop_back()都是常量級的操作.如果水杯滿了,則申請乙個兩倍深度的水杯,將原水杯裡的水倒入(當然這裡描述的不好,應該是拷貝).

vectors 包含著一系列連續儲存的元素,其行為和陣列類似。訪問vector中的任意元素或從末尾新增元素都可以在常量級時間複雜度內完成,而查詢特定值的元素所處的位置或是在vector中插入元素則是線性時間複雜度。

當我們將新元素插入於vector尾端時,該函式會首先檢查是否還有備用空間,如果有就直接在備用空間上建構函式,並調整迭代器finish,使vector變大.如果沒有則擴充空間,如果原大小不是0,則預設擴大兩倍.

其配置完空間會將原vector拷貝過來並且釋放原vector空間.調整迭代器指向新vector.

reserve是容器預留空間,但並不真正建立元素物件,在建立物件之前,不能引用容器內的元素,因此當加入新的元素時,需要用push_back()/insert()函式。

resize是改變容器的大小,並且建立物件,因此,呼叫這個函式之後,就可以引用容器內的物件了,因此當加入新的元素時,用operator操作符,或者用迭代器來引用元素物件。再者,兩個函式的形式是有區別的,reserve函式之後乙個引數,即需要預留的容器的空間;resize函式可以有兩個引數,第乙個引數是容器新的大小,第二個引數是要加入容器中的新元素,如果這個引數被省略,那麼就呼叫元素物件的預設建構函式。

相較於vector的連續線性空間,list就顯得複雜許多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間.

list是乙個帶頭節點的環狀雙向鍊錶.

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

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

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

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

《STL原始碼剖析》 序列式容器(二)list容器

list概述 相較於vector的連續線性空間,list就有點複雜了,但複雜有複雜的好處,每次插入或刪除乙個元素,就配置或釋放乙個元素。因此list不存在浪費空間的問題。而且對於任何位置插入或釋放元素,時間是常值。list的迭代器 首先list的節點 node 是乙個雙向鍊錶。另外list不能像ve...