一.
1、什麼是標準模板庫(stl)?
(1)c++標準模板庫與c++標準庫的關係
c++標準模板庫其實屬於c++標準庫的一部分,c++標準模板庫主要是定義了標準模板的定義與宣告,而這些模板主要都是
類模板,我們可以呼叫這些模板來定義乙個具體的類;與之前的自己手動建立乙個函式模版或者是類模板不一樣,我們使用了
stl就不用自己來建立模板了,這些模板都定義在標準模板庫中,我們只需要學會怎麼使用這些類模板來定義乙個具體的類,
然後能夠使用類提供的各種方法來處理資料。
(2)stl六大元件:容器(containers)、演算法(algorithms)、迭代器(iterators)、函式物件(functors)、介面卡(adapters)、分配器(allocators)
2、迭代器
迭代器是一種物件,它能夠用來遍歷stl容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址,所以可以認為迭代器其實就是用來指向容器中數
據的指標,我們可以通過改變這個指標來遍歷容器中的所有元素。
3、容器
首先,我們必須理解一下什麼是容器,對比我們生活當中的容器,例如水杯、桶、水瓶等等這些東西,其實他們都是容器,他們的乙個共同點就是:都是用來
存放液體的,能夠用來存放一些東西;其實在我們的c++中說的這個容器其實作用也是用來存放"東西",但是存放的是資料,在c++中容器就是一種用來存放
資料的物件。
(1)c++中的容器其實是容器類例項化之後的乙個具體的物件,那麼可以辦這個物件看成就是乙個容器。
(2)因為c++中容器類是基於類模板定義的,也就是我們這裡說的stl(標準模板類)。為什麼需要做成模板的形式呢?因為我們的容器中存放的資料型別其實
是相同的,如果就因為資料型別不同而要定義多個具體的類,這樣就不合適,而模板恰好又能夠解決這種問題,所以c++中的容器類是通過類模板的方式定義的
,也就是stl。
(3)容器還有另乙個特點是容器可以自行擴充套件。在解決問題時我們常常不知道我們需要儲存多少個物件,也就是說我們不知道應該建立多大的記憶體空間來存放我們
的資料。顯然,陣列在這一方面也力不從心。容器的優勢就在這裡,它不需要你預先告訴它你要儲存多少物件,只要你建立乙個容器物件,並合理的呼叫它所提
供的方法,所有的處理細節將由容器來自身完成。它可以為你申請記憶體或釋放記憶體,並且用最優的演算法來執行您的命令。
(4)容器是隨著物件導向語言的誕生而提出的,容器類在物件導向語言中特別重要,甚至它被認為是早期物件導向語言的基礎。
4、容器的分類
stl對定義的通用容器分三類:順序性容器、關聯式容器和容器介面卡。
我想說的是對於上面的每種型別的容器到底是是什麼意思,其實沒必要去搞懂,沒什麼價值,只要你能夠大概理解知道即可,知道每種容器型別下有哪些具體的容器
即可。順序性容器:vector、deque、list
關聯性容器:set、multiset、map、multimap
容器介面卡:stack、queue、
1.vector向量
vector向量是一種順序行容器。相當於陣列,但其大小可以不預先指定,並且自動擴充套件。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態陣列。
在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料儲存,初始的空間大小可以預先指定也可以由vector 預設指定。當儲存的資料超過分配的
空間時vector 會重新分配一塊記憶體塊,但這樣的分配是很耗時的,在重新分配空間時它會做這樣的動作:
首先,vector 會申請一塊更大的記憶體塊;
然後,將原來的資料拷貝到新的記憶體塊中;
其次,銷毀掉原記憶體塊中的物件(呼叫物件的析構函式);
最後,將原來的記憶體空間釋放掉。
當vector儲存的資料量很大時,如果此時進行插入資料導致需要更大的空間來存放這些資料量,那麼將會大大的影響程式執行的效率,所以我們應該合理的使用vector。
(1)初始化vector物件的方式:
vectorv1; // 預設的初始化方式,內容為空
vectorv2(v1); // v2是v1的乙個副本
vectorv3(n, i) // v3中包含了n個數值為i的元素
vectorv4(n); // v4中包含了n個元素,每個元素的值都是0
(2)vector常用函式
empty():判斷向量是否為空,為空返回真,否則為假
begin():返回向量(陣列)的首元素位址
end(): 返回向量(陣列)的末元素的下乙個元素的位址
clear():清空向量
front():返回得到向量的第乙個元素的資料
back():返回得到向量的最後乙個元素的資料
size():返回得到向量中元素的個數
push_back(資料):將資料插入到向量的尾部
pop_back():刪除向量尾部的資料
.....
2.map
map是stl的乙個關聯容器,它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的。至於二叉樹這種資料結構,本人暫時沒有任何了解。在map這個容器中,提供一種「鍵- 值」關係的一對一的資料儲存能力。其「鍵」在容器中不可重複,且按一定順序排列,至於怎麼排列,那麼紅黑樹這種資料結構的特性了。
(1)初始化map物件的方式
mapm1 = , , }; // 例項化乙個map容器,還有3組資料
mapm2; // 例項化乙個空map容器
(2)map常用函式
begin():返回容器第乙個元素的迭代器
end():返回容器最後乙個元素之後的迭代器
rbegin():
rend():
clera():清除容器中所有元素
empty():判斷容器是否為空
insert(p1):插入元素 p1 是通過pair函式建立的對映關係對
insert(pair('s', "shenzhen")): 插入元素
size():返回容器中元素的個數
count():返回指定鍵對應的資料的出現的次數
get_allocator():返回map的配置器
swap():交換兩個map容器的元素
.....
遍歷方式
map容器支援迭代器正向方式遍歷和迭代器反向方式遍歷,同時也支援 方式訪問資料,中的索引值是鍵值,這個一定要清楚
3.set
使用平衡二叉樹管理元素
集合(set)
是一種包含已排序物件的關聯容器。
必須包含的標頭檔案
#include
map容器是鍵
-值對的集合,好比以人名為鍵的位址和**號碼。相反地,
set容器只是單純的鍵的集合。當我們想知道某位使用者是否存在時,使用
set容器是最合適的。
set中不允許
key相同的元素,
multiset
允許key
相同的元素
4.pair
pair
模板可以用於生成
key-value
對5.順序性容器和關聯容器
(1)關聯容器對元素的插入和刪除操作比vector要快,因為vector是順序儲存,而關聯容器是鏈式儲存;比list 要慢,是因為即使它們同是鏈式結構,但list 是線性的,而關聯容器是二叉樹結構,其改變乙個元素涉及到其它元素的變動比list 要多,並且它是排序的,每次插入和刪除都需要對元素重新排序;
(2)關聯容器對元素的檢索操作比vector 慢,但是比list 要快很多。vector 是順序的連續儲存,當然是比不上的,但相對鏈式的list 要快很多是因為list 是逐個搜尋,它搜尋的時間是跟容器的大小成正比,而關聯容器 查詢的複雜度基本是log(n) ,比如如果有1000 個記錄,最多查詢10 次,1,000,000 個記錄,最多查詢20 次。容器越大,關聯容器相對list 的優越性就越能體現;
二.algorithm
stl演算法部分主要由標頭檔案,,組成。要使用 stl中的演算法函式必須包含標頭檔案,對於數值演算法須包含,中則定義了一些模板類,用來宣告函式物件。
stl中演算法大致分為四類:
1、非可變序列演算法:指不直接修改其所操作的容器內容的演算法。
2、可變序列演算法:指可以修改它們所操作的容器內容的演算法。
3、排序演算法:包括對序列進行排序和合併的演算法、搜尋演算法以及有序序列上的集合操作。
4、數值演算法:對容器內容進行數值計算。
STL學習總結
歷時一月左右,基本看完了c 標準庫的原始碼,忽略了一些用處不那麼大的部分,和一些複雜難以理解的演算法 輸入輸出庫,一些複雜的演算法 stable sort,stable partition,inplace merge,list的排序,紅黑樹的調整等 總體而言,收益還是蠻多的,首先了解了stl容器的用...
STL學習總結
stl standard template library,標準模板庫 是惠普實驗室開發的一系列軟體的統稱。stl從廣義上分為 容器 演算法 迭代器,容器和演算法之間通過迭代器進行無縫連線。stl幾乎所有的 都採用了模板類或者模板函式,這相比傳統的由函式和類組成的庫來說提供了更好的 重用機會 stl...
STL學習總結
總結stl中vector,set,multiset,map,multimap,deque,stack,list,queue,priority queue,string的優缺點以及基本的函式用法。stl存在的意義就是把c語言中資料結構的很多很多的 封裝成乙個個函式名,方便呼叫,提高效率。include...