stl(standard template library,標準模板庫),是惠普實驗室開發的一系列軟體的統稱。
stl從廣義上分為:容器、演算法、迭代器,容器和演算法之間通過迭代器進行無縫連線。stl幾乎所有的**都採用了模板類或者模板函式,這相比傳統的由函式和類組成的庫來說提供了更好的**重用機會
stl提供了六大元件,彼此之間可以組合套用,這六大元件分別是:容器、演算法、迭代器、仿函式、介面卡、空間配置器。
容器:各種資料結構,如vector、list、deque、set、map等,用來存放資料,從實現角度來看,stl容器是一種class template。
演算法:各種常用的演算法,如sort、find、copy、for each。從實現的角度來看,stl演算法是一種function tempalte
迭代器:扮演了容器與演算法之間的膠合劑,共用五種型別,從實現角度來看,迭代器是一種將 operator*,operator->,operator++,operator–等指標相關操作予以過載的class template,所有stl容器都附帶有自己專屬的迭代器,只有容器的設計者才知道如何遍歷自己的元素,原生指標也是一種迭代器。
仿函式:行為雷氏函式,可作為演算法的某種策略,從實現的角度來看,仿函式是一種過載了operator()的class或者class template
介面卡:一種用來修飾容器或者仿函式或迭代器介面的東西。
空間介面卡:負責空間的配置與管理,從實現角度看,配置器是乙個實現了動態空間配置、空間管理、空間釋放的class tempalte
stl六大元件的互動關係,容器通過空間配置器取得資料儲存空間,演算法通過迭代器儲存容器中的內容,仿函式可以協助演算法完成不同的策略的變化,介面卡可以修飾仿函式。
stl容器就是將運用最廣泛的一些資料結構實現出來,主要有陣列(array)、鍊錶(list)、樹(tree),棧(stack),佇列(queue),集合(set),對映表(map)。根據資料在容器的排列特性,這些資料分為序列式容器和關聯式容器兩種。
演算法分為:質變演算法和非質變演算法
質變演算法:是指運算過程中會更改區間內的元素的內容。例如拷貝、替換、刪除等
非質變演算法:是指運算過程中不會更改區間內的元素內容,例如查詢、計數、遍歷、尋找極值等。
迭代器的種類:
種類功能
支援方法
輸入迭代器
提供對資料的唯讀訪問
唯讀,支援++、==、!=
輸出迭代器
提供資料的只寫訪問
只寫,支援++
前向迭代器
提供寫操作,並能向前推進迭代器
讀寫,支援++、==、!=
雙向迭代器
提供讀寫操作,並能向前和向後操作
讀寫,支援++、–
隨機訪問迭代器
提供讀寫操作,並能在資料中隨機移動
讀寫,支援++、–、[n]、-n、《等
在c++標準庫中定義了string類,定義在標頭檔案<\string>
string和c風格字串對比:
vector的資料安排以及操作方式,與array(陣列)非常相似,兩者的唯一差別在於空間的運用的靈活性,array是靜態空間,一旦配置了就不能改變,要換大一點或者小一點的空間,比較複雜。
vector的實現技術,關鍵在於其對大小的控制以及重新配置時的資料移動效率。其動態增加大小,並不是在原空間之後續接新空間(因為無法保證原空間之後尚有可配置的空間),而是取一塊更大的記憶體空間,然後將原資料拷貝新空間,並釋放原空間。因此,對vector的任何操作,一旦引起空間的重新配置,指向原vector的所有的迭代器就都失效了。
vector支援隨機訪問,所以vector提供的是隨機訪問迭代器
vector容器是單向開口的連續記憶體空間,deque則是一種雙向開口的連續性空間,所謂的雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作,當然,vector容器也可以在頭尾兩端插入元素,但是在其頭部操作效率奇差,無法被接受。
deque和vector最大的差異,一在於deque允許使用常數項對頭端進行元素的插入和刪除操作。二是deque沒有容量的概念,因為它是動態的以分段連續空間組合而成,隨時可以增加一段新的空間鏈結起來。deque的迭代器並不是普通的指標,其複雜度和vector不是乙個量級,這當然影響各個運算的層面。因此,除非有必要,我們應該盡可能的使用vector,而不是deque,對deque進行的排序操作,為了最高效率,可將deque先完整的複製到乙個veector中,對vector容器進行拍下,在複製會deque。
deque是由一段一段的定量的連續空間構成,一旦有必要在deque前端和尾端增加新的空間,便配置一段連續定量的空間,串接在deque的頭端或者尾端。deque最大的工作就是維護這些的分段連續的記憶體空間的整體性的假象,並提供隨機訪問的介面,避開了重新配置空間,複製,釋放的輪迴,代價就是複雜的迭代器架構。
既然deque是分段連續記憶體空間,那麼就必須有**控制,維持整體連續的假象,資料結構的設計及迭代器的前進後退操作頗為繁瑣,deque**的實現遠比vector或list都多得多。
deque採取一塊所謂的map(不是stl的map容器)作為主控,這裡所謂的map是一小塊連續的記憶體空間,其中每乙個元素都是乙個指標,只想另一段連續性記憶體空間,稱為緩衝區,緩衝區才是deque的儲存空間的主體。
stack是一種先進後出的資料結構,它只有乙個出口。stack容器允許新增元素,移除元素,取得棧頂元素,但是除了最頂端外,沒有任何其他方法可以訪問stack的其他元素。換言之,stack不允許有遍歷行為。有元素推入棧的操作稱為push,將元素推出stack的操作成為pop
stack所有元素的進出都必須符合「先進後出」的條件,只有stack頂端的元素,才有機會被外界去用,stack不提供遍歷功能,也不提供迭代器。
queue是一種先進先出的資料結構,它有兩個出口,queue容器允許從一端新增元素,從另一端移除元素。
queue和stack容器一樣,不提供遍歷功能,也不提供迭代器。
鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點組成。結點可以在執行時動態生成。每個結點包括兩個部分:乙個儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。
相較於vector的連續線性空間,list就顯得負責許多,它的好處是每次插入或者刪除乙個元素,就是配置或者釋放乙個元素的空間。因此,list對於空間的運用有著絕對的精準,一點也不浪費。而且,對於任何位置的元素插入或元素的移除,list永遠是常數時間。
list和vector是兩個最常被使用的容器。
list容器是乙個雙向鍊錶。
list容器不能想vector一樣以普通指標作為迭代器,因為其節點不能保證在同一塊連續的記憶體空間上。list迭代器必須有能力只想list的節點。並有能力進行正確的遞增、遞減、取值、成員訪問操作。在遞增的時候指向下乙個節點,遞減時指向上乙個節點,取值時取得是節點的資料值,成員用時取的是節點的成員。
由於list是乙個雙向鍊錶,迭代器必須能夠具備前移、後移的能力,所以list容器提供的bidirectional itreators(雙向)
list不僅是乙個雙向鍊錶,而且還是乙個迴圈的雙向鍊錶
set的特性就是所有的元素會根據元素的鍵值自動排序,set的元素不想map那樣可以同時擁有實值和鍵值,set的元素既是鍵值又是實值,set不允許兩個元素有相同的鍵值。
我們不能通過set的迭代器改變set元素的值,因為set元素值就是其鍵值,關係到set元素的排序規則,如果任意改變set元素值,會嚴重破壞set組織,set的iterator是一種const_iterator
set擁有和list某些相同的性質,當對容器中的元素進行插入操作或者刪除操作的時候,操作之前所有的迭代器,在操作完成之後依然有效。
multiset容器特性及用法和set完全相同,唯一差別在於它允許鍵值重複,set和multiset的底層實現是紅黑樹,紅黑樹為平衡二叉樹的一種。
map的特性是,所有的元素都會根據元素的鍵值自動排序,map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。
我們不可以通過map的迭代器改變map的鍵值,因為map的鍵值關係到map元素的排列規則,任意改變map鍵值會嚴重破環map組織,如果想要修改元素的實值,那麼是可以的。
map和list擁有相同的某些性質,當對它的容器元素進行新增操作或者刪除操作時,操作之前的所有的迭代器,在操作完成之後依然有效。
multimap和map的操作類似,唯一區別multimap鍵值可重複
map和multimap都是以紅黑樹為底層實現機制。
stl容器所提供的都是值寓意,而非引用寓意,也就是當我們給容器中插入元素的時候,容器內部實施了拷貝動作,將我們要插入的元素再另行拷貝乙份放入到容器當中,而不是將原資料直接放入容器當中,也就是說我們提供的元素必須能夠被拷貝的。
vector
deque
list
setmultiset
mapmultimap
典型記憶體結構
單端陣列
雙端陣列
雙向鍊錶
二叉樹二叉樹
二叉樹可隨機訪問是是
否否否對key而言:不是
元素搜尋速度慢慢
非常慢快
快對key而言:快
元素安插移除
尾端頭尾兩端
任何位置--
-
STL學習總結
歷時一月左右,基本看完了c 標準庫的原始碼,忽略了一些用處不那麼大的部分,和一些複雜難以理解的演算法 輸入輸出庫,一些複雜的演算法 stable sort,stable partition,inplace merge,list的排序,紅黑樹的調整等 總體而言,收益還是蠻多的,首先了解了stl容器的用...
STL學習總結
一.1 什麼是標準模板庫 stl 1 c 標準模板庫與c 標準庫的關係 c 標準模板庫其實屬於c 標準庫的一部分,c 標準模板庫主要是定義了標準模板的定義與宣告,而這些模板主要都是 類模板,我們可以呼叫這些模板來定義乙個具體的類 與之前的自己手動建立乙個函式模版或者是類模板不一樣,我們使用了 stl...
STL學習總結
總結stl中vector,set,multiset,map,multimap,deque,stack,list,queue,priority queue,string的優缺點以及基本的函式用法。stl存在的意義就是把c語言中資料結構的很多很多的 封裝成乙個個函式名,方便呼叫,提高效率。include...