




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章STL容器容器分類、特點、共性序列容器:向量vector序列容器:雙端隊列deque序列容器:鏈表list關聯(lián)容器:集合set關聯(lián)容器:映射map關聯(lián)容器:Hash集合關聯(lián)容器:Hash映射容器適配器1/73容器Container存放同類型元素的類模板:容器分類標準容器(通用容器)容器適配器(特殊容器)容器順序容器關聯(lián)容器vectordequelistset,multisetmap,multimaphash_set,hash_multisethash_map,hash_multimapstackqueuepriority_queue2/73順序容器:元素有序ordered,但未排序sorted關聯(lián)容器:元素按關鍵字(key)排序,快速查找容器適配器:修改容器接口,具備新特點順序容器SequenceContainersvector<T>
向量——應用廣泛動態(tài)數(shù)組:大小自動調整隨機訪問:連續(xù)存放,常量時間插入刪除:末端快,其他位置慢(移動元素)重新分配空間:保留內存不夠時,空間加倍——
元素復制如對象需構造和析構選擇容器:順序容器特點3/73deque<T>
雙端隊列(double-endedqueue)存儲格式:塊內順序+塊間鏈表,邏輯上連續(xù)隨機訪問:速度遠不如
vector(嚴重缺點)插入刪除:兩端快(優(yōu)點),其他位置慢空間分配:無保留空間(reserved),增加一塊連續(xù)
空間連入即可,速度比vector快很多l(xiāng)ist<T>鏈表存儲結構:雙向循環(huán)鏈表每個結點放一個元素順序訪問元素雙向,不能隨機訪問不能用[],at()不存在空間不夠:無容量和內存重新分配函數(shù)任何位置上插入刪除效率高(優(yōu)點)選擇容器:順序容器特點4/73關聯(lián)容器AssociatedContainers——快速查找容器元素:
<key,value>對,按key有序數(shù)據(jù)結構:平衡二叉樹BBTBalancedBinaryTree
紅黑樹RB-Tree——快速查找set<key>
集合
只一個查找鍵key,且唯一相等multiset<key>
多重集合只一個查找鍵key,可重復map<key,value>
映射
key–value對,key唯一multimap<key,value>
多重映射
key–value對,key可重復選擇容器:關聯(lián)容器特點按key排序5/73有些編譯器VC2005增加了4種關聯(lián)容器類型:數(shù)據(jù)結構:散列表
Hash表查找時間效率更高hash_set<key>
散列集
#include<hash_set>hash_multiset<key>
散列多重集
#include<hash_set>hash_map<key,value>
散列映射
#include<hash_map>hash_multimap<key,value>
散列多重映射
#include<hash_map>選擇容器:關聯(lián)容器特點key無序過時的,淘汰的MSDN6/73容器適配器ContainerAdapter修改原容器basecontainer,具備新特點容器適配器:不提供迭代器stack 棧
STL:deque 后進先出LIFOqueue 隊列
STL:deque先進先出FIFOpriority_queue優(yōu)先隊列
STL:
vector優(yōu)先:每個元素有一個優(yōu)先值=key名為隊列,實非隊列:不滿足FIFO堆heap
:max-heap,min-heap
復習數(shù)據(jù)結構
STL
默認:max-heap
優(yōu)先值最高(大)者先“出隊”選擇容器:容器適配器特點7/73似容器almostcontainer,擬容器——像容器,但與真正容器不盡相同string
字符串元素類型:不像容器可選擇各種數(shù)據(jù)類型專門優(yōu)化:用法與容器有差別valarray<T>
值數(shù)組為數(shù)值計算而優(yōu)化的向量提供數(shù)值運算和數(shù)學函數(shù)bitset<N>
位集合提供二進制位集合位數(shù)N的各種操作方便二進制位運算選擇容器:似容器特點8/73缺省構造函數(shù):容器類的默認初始化拷貝構造函數(shù):生成現(xiàn)有容器的副本析構函數(shù):
不需要容器時整理內存empty()
容器中元素個數(shù)=0返回truemax_size()
返回容器最多能容納的元素個數(shù)size()
返回容器中當前元素個數(shù)容器賦值:=
一個容器賦給另一個容器容器比較:<<=>>===!=
兩個容器比較,條件成立返回true
不適于priority_queueswap() 交換兩個容器的元素容器共性一般不關心9/73begin()
返回(const_)iterator
指向第一個元素end()
返回(const_)iterator
指向最后一個元素之后rbegin()
返回(const_)reverse_iterator
指向最后一個元素rend()
返回(const_)reverse_iterator
指向第一個元素之前erase()
刪除若干個元素clear()
刪除全部元素標準容器共性10/73例:vector構造與初始化string數(shù)組頭文件v4有幾個元素?類型?v5有幾個元素?類型?問題11/73例:vector容量230-1capacity():???重新分配內存前的最大容量下頁12/73例:vector容量想一想:怎么顯示vector中的每個元素?13/73
下標操作符vt[index] 返回:index元素的引用
可讀可寫成員函數(shù)vt.at(index) 返回:index元素的引用vt.front() 返回:第一個元素的引用vt.back() 返回:最后一個元素的引用迭代器位置指示iterator
vt.begin()reverse_iteratorvt.rbegin()iteratorvt.end()
reverse_iteratorvt.rend()vector訪問元素vector<typenameT>vt14/73例:vector訪問元素15/73例:vector判空初始化向量v逐個添加元素結構體逐個讀取元素逐個刪除元素capacity=?刪除操作自動減少vector的容量嗎?16/73例:vector插入元素//下頁容器內元素變化使迭代器失效插入元素自動增加vector容量17/73例:vector插入元素回顧18/73元素賦值voidassign(size_type_Count,constType&_Val); _Count:_Val個數(shù),_Val:容器元素值(賦值)template<classIterator>//輸入型迭代器voidassign(Iterator_First,Iterator_Last);//區(qū)間刪除元素iteratorerase(const_iterator_Where);//刪除位置iteratorerase(const_iterator_First,const_iterator_Last);voidpop_back(); //erase(end()-1,end())voidclear(); //erase(begin(),end())交換元素voidswap(vector<Type,Allocator>&_Right);friendvoidswap(vector<Type,Allocator>&_Left, vector<Type,Allocator>&_Right);vector元素:賦值刪除交換19/73賦值(一)賦值(二)元素地址交換的是什么?元素值?地址?earse()怎么用?20/73deque
特點接近于vector與vector比較選擇容器優(yōu)點:兩端插入刪除很快,提供相應的成員函數(shù)不用的內存即釋放。刪除即釋放,需要則分配內存分配速度快分塊存儲,無
capacity概念缺點:支持隨機訪問元素,但速度遠不如vector除首尾元素外,其他位置插入刪除速度也很慢*如需頻繁在首尾外位置插入刪除元素,應用list順序容器:雙端隊列回顧21/73deque:頭插與刪頭22/73deque與vector內存分配deque←這兩句的區(qū)別?23/73自編FIFO
隊列類構思:隊列數(shù)據(jù)存儲?構思:FIFO隊列操作限制?需要哪些成員函數(shù)?參數(shù)和返回值?怎么自編隊列?24/73list特點特有成員函數(shù)voidremove(constT&x);刪除所有元素值=x
元素voidremove_if(T
pr); 刪除符合條件謂詞pr的元素voidsort(); 所有元素排序默認升序less<int>()voidsort(Tpr); 按條件謂詞pr
排序voidunique(); 相鄰的重復元素預排序僅留一個voidsplice(iteratorit,list&L);
合并兩個list:插入Lvoidsplice(iteratorit,list&L,iteratoritL);插一個元素voidsplice(iteratorit,list&L,iteratorfirstL,iteratorlastL);voidmerge(list&x); 不如splice靈活voidmerge(list&x,Tpr);voidreverse(); 反轉元素的位序順序容器:鏈表回顧詳細用法,下頁舉例函數(shù)對象25/73例:list基本函數(shù)sortsort26/73list:splice()用法例L1和L3并入L2用list迭代器將L4并入L2展開初始化L1~L427/73特有成員函數(shù)
int
count(Key&key);返回:值=key的元素個數(shù)
iterator
find(Key&key);返回迭代器:值等于key;不滿足返回end()
iterator
lower_bound(Key&key);>=key
iterator
upper_bound(Key&key);>key返回迭代器:>=key或>key,
不滿足返回end()
pair<first,second>
equal_range(Key&key);返回兩個迭代器:first=lower,second=upper
void
swap(set&s); 交換單集合元素
void
swap(multiset&s); 交換多集合元素無pop和push系列函數(shù),用insert()
和erase()關聯(lián)容器:set/multiset回顧用法舉例:下頁最末一個元素后面28/73multiset構造集合的構造方法29/73set與multiset成員函數(shù)個數(shù)集合的成員函數(shù)30/73template<classKey, //排序鍵(sortkey)類型classType, //映射值value類型classTraits
=less<Key>,//key比較,缺省(升序),可改變
classAllocator=allocator<pair<constKey,Type>>//用缺省
>
class
map
;
//類模板//----------------------------------------------------------------------------template
<classKey,classType,classTraits=less<Key>,
classAllocator=allocator<pair<constKey,Type>>>
class
multimap;
//類模板關聯(lián)容器:map/multimap定義回顧模板參數(shù)31/73
typedef
typedefpair<Key,Type>
value_type;
將兩個數(shù)據(jù)(key,value)構成一個key-vlaue對成員函數(shù)見msdn
multimap&
operator=(multimap&_Right);
Aftererasinganyexistingelementsinamultimap,
perator=eithercopiesormovesthecontentsof_Rightintothemultimap.map/multimup對象賦值:=右端賦值給=左端iteratoremplace(val);插入元素val并返回指向val的迭代器若插入key-vlaue,不需構成<key-vlaue>對類型關聯(lián)容器:map/multimap32/73multimap構造int改char*???int改string???省略,只能進行簡單的string處理33/73multimap構造按key排序34/73multimap構造(2)比較上例上例:int35/73multimap構造(2)比較上例<key–value>36/73multimap構造:插入和賦值不需pail<key,value>比較上例37/73multimap成員函數(shù)
返回地址即迭代器升序注意比較注意比較注意比較將容器清空38/73bucket(桶)存儲元素:hash(key)值相同沖突的元素存入同一個桶桶的數(shù)量:容器里有若干個桶,bucket_count()插入元素:桶數(shù)量自動增加必要時,rehash()
指定最小值元素順序:先插入的元素在前,key相等元素邏輯相鄰intbucket_count() 返回:容器中桶的數(shù)量intbucket(key) 返回:桶的編號,存放元素keyintbucket_size(n) 返回:編號n的桶中元素數(shù)量iterator
emplace(val)
插入val,返回指向val的迭代器Hashhash_function() 返回:hash函數(shù)對象void
rehash(n) 重建hash表,桶數(shù)>=nfloat
load_factor() 平均裝填因子=元素數(shù)量/桶數(shù)量floatmax_load_factor()最大裝填因子裝滿=1,改變無意義unordered_set/_multiset類特殊成員函數(shù)回顧39/73hash_set/hash_multiset
構造方法回顧與multiset比較復習:哈希函數(shù)沖突解決40/73unordered_multiset構造方法回顧hash_multiset41/73unordered_multiset類成員函數(shù)unordered_multiset成員函數(shù)42/73unordered_multiset高級#include<unordered_set>9/649/12843/73unordered_map/_multimap回顧44/73unordered_map/_multimap比較前例45/73multimap查找刪除比較前例key無序46/73multimap查找刪除修改元素<key,value>清空容器47/73?;靖拍?/p>
復習數(shù)據(jù)結構順序棧:順序存儲結構鏈式棧:鏈式存儲結構容器適配器:stack和queue固定數(shù)組存儲動態(tài)數(shù)組存儲NULL單向鏈表存儲雙向鏈表存儲48/73隊列基本概念
復習數(shù)據(jù)結構順序隊列:順序存儲結構鏈式隊列:鏈式存儲結構容器適配器:stack和queue…隊尾對頭固定數(shù)組存儲動態(tài)數(shù)組存儲單向鏈表存儲雙向鏈表存儲邏輯結構49/73基本容器
(有條件)在已有容器基礎上修改,具備新特點stack基本容器具有
size,empty,push_back,pop_back,front,back等函數(shù)——
vector
,deque,listqueue基本容器具有
size,empty,push_back,pop_front,front,back等函數(shù)——deque,list容器適配器:stack和queue回顧vector沒有自編隊列例順序鏈式鏈式50/73template
<classType,classContainer=deque<Type>>classstack
{…}//-----------------------------------------------template
<classType,classContainer=deque<Type>>classqueue{…}STL:stack和queue定義51/73例:STLstack52/73例:STLstack創(chuàng)建棧v1,v2,v3
進棧讀棧頂元素:top()出?;驈棗?pop()清空棧iota()生成v1,v2,v353/73例:STLqueue入隊s1,s2,s3,s4讀隊尾元素(類型)?讀隊頭讀隊頭出隊全部出隊輸出屏幕54/73優(yōu)先隊列:
就是堆,或者用堆實現(xiàn)的優(yōu)先值排序:
堆排序max-heap
復習數(shù)據(jù)結構邏輯結構:具有父母優(yōu)勢的一棵完全二叉樹父母優(yōu)勢:任意父母結點key≥子女結點key
容器適配器:priority_queue回顧最大堆最小堆不是堆975481完全二叉樹55/73滿二叉樹FullBinaryTree,FBT定義:設樹高h,結點總數(shù)
n=
2h-1
的二叉樹。圖示n=20+21+22+…+2h-1
=2h-1特點:不存在單分支度=1結點不缺葉結點只出現(xiàn)在最底層不缺滿二叉樹h=4層數(shù)完全二叉樹CompletedBinaryTree,CBT特點:滿二叉樹最底層從右至左、連續(xù)缺若干個葉子完全二叉樹的特例:滿二叉樹葉結點只出現(xiàn)在最底兩層上完全二叉樹k=1k=2k=3k=4n結點完全二叉樹的樹高證明:完全二叉樹高h,結點數(shù)n=2h-1→完全二叉樹結點數(shù)n:介于樹高=h-1和樹高=h
的兩棵滿二叉樹之間:
2h-1
-1<n≤
2h-1
——各項都是整數(shù)
→
2h-1≤n<
2h兩邊取對數(shù):
h-1≤log2n<h因h為整數(shù),有:完全二叉樹:重要性質對數(shù)關系對任一結點i父母:左子女:右子女:左兄弟:右兄弟:如此編號:整棵樹的結構關系均可計算出來!完全二叉樹的性質圓圈內數(shù)字:結點編號i,上→下,左→右124589101136712確定父母結點編號區(qū)間?且為奇數(shù)且為偶數(shù)注意條件父母:i≤
n/2
完全二叉樹:存儲結構順序124589101136712i為奇數(shù)i為偶數(shù)按編號序存入數(shù)組H[i]編號i0123456789101112值H[i]e1e2e3e4e5e6e7e8e9e10e11e12父母區(qū)葉子區(qū)父母:i≤
n/2
計算而非存儲:相關結點的關系堆的存儲結構堆——具有父母優(yōu)勢的完全二叉樹堆:存儲結構9754210123456-975241數(shù)組存儲非葉子區(qū)葉子區(qū)可放置限位器(觀察哨)樹高完全二叉樹完全二叉樹和數(shù)組一一對應構造堆——下推算法篩選法、值交換法舉例:對序列{2,9,7,6,5,8}
構造max-heap構造堆:下推算法297568297568298567298567928567968527-297658邏輯結構堆排序:算法策略構造堆:max-heap,min-heap刪除根:max,min反復執(zhí)行上述兩步(n-1)次,刪除元素的順序:有序根刪除:算法策略刪除原則刪除后依然是堆,不改變堆的性質替換法刪除根后,最后的葉子與根交換,作為新根替換后:新根滿足父母優(yōu)勢?No: ——下推至合適位置
問:其他的父母結點需要下推嗎?堆排序:算法策略邏輯結構描述:根刪除過程最差時間效率T(n):最差情況:新根下推至最底層的葉結點,樹高h比較次數(shù):T(n)=2h
=2log2(n+1)∈Θ(logn)存儲結構描述:根刪除過程堆的存儲結構:數(shù)組(STL:vector)堆排序:邏輯過程986521186529816529856129堆排序:物理過程297568堆排序{2,9,7,6,5,8}-752869-756829-756892-75
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年美術教師編制考試模擬試卷:美術教育心理學與兒童心理發(fā)展試題
- 2025年執(zhí)業(yè)藥師藥學專業(yè)知識試卷:藥學專業(yè)臨床藥學實踐試題
- 高中語文跨學科閱讀教學研究-以《紅樓夢》為例
- 2025年鄉(xiāng)村醫(yī)生考試題庫:農(nóng)村醫(yī)療衛(wèi)生服務政策應用試題
- 2025年中學教師資格《綜合素質》教學反思與總結教師素養(yǎng)試題試卷
- 2025年消防執(zhí)業(yè)資格考試題庫:消防救援隊伍管理法規(guī)及火災事故調查試題
- 2025-2030中國核受體ROR-γ行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025年房地產(chǎn)經(jīng)紀人職業(yè)資格考試模擬試卷:房地產(chǎn)經(jīng)紀人職業(yè)資格考試備考誤區(qū)解析
- 2025-2030中國果汁原漿行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 全球商品進出口協(xié)議
- DB33-1036-2021《公共建筑節(jié)能設計標準》
- 巖芯鑒定手冊
- 快速排序算法高校試講PPT
- 甘肅歷史與甘肅文化
- 工程勘察設計收費標準
- 高邊坡施工危險源辨識及分析
- SAP航空行業(yè)數(shù)字化轉型解決方案(優(yōu)秀方案集)
- 江蘇工業(yè)企業(yè)較大以上風險目錄
- 《村衛(wèi)生室管理辦法(試行)》課件(PPT 49頁)
- 監(jiān)理質量評估報告(主體分部)
- 鍋爐爆炸事故演練方案(模板)
評論
0/150
提交評論