版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1C+C+高級編程高級編程 ( (六六) )聯(lián)航精英訓(xùn)練營2C+C+模板技術(shù)模板技術(shù)3問題的引入問題的引入n 一個求最大值的問題?int max(int a, int b) return a b ? a : b;float max(float a, float b) return a b ? a : b;char max(char a, char b) return a b ? a : b; 當(dāng)我們需要求不同類型數(shù)值的最大值時,我們不得不重載代碼幾乎一樣的不同版本的max函數(shù) 那么有沒有辦法讓程序能夠自動識別我們輸入的類型并復(fù)用同樣的代碼呢?4C+C+模板技術(shù)模板技術(shù)n 函數(shù)模板 p函數(shù)模板p
2、模板的形參限制p模板的實例化 n 類模板 p類模板的優(yōu)勢p類模板及成員函數(shù)的定義p類模板的繼承與派生 5函數(shù)模板函數(shù)模板n 函數(shù)模板是一個獨立于類型的函數(shù),可產(chǎn)生函數(shù)特定類型的版本。通過對參數(shù)類型進(jìn)行參數(shù)化,獲取有相同形式的函數(shù)體。n 它是一個通用函數(shù),它可適應(yīng)一定范圍內(nèi)的不同類型對象的操作。n 函數(shù)模板將代表著不同類型的一組函數(shù),它們都使用相同的代碼,這樣可以實現(xiàn)代碼重用,避免重復(fù)勞動,又可增強程序的安全性。 6函數(shù)模板函數(shù)模板函數(shù)模板的定義格式:template 類型 函數(shù)名(參數(shù)表) /函數(shù)體 模板形參表又稱參數(shù)化類型名表,多個表項用逗號分隔。每個項稱為一個模板參數(shù)(模板形參)。格式如下
3、:class 或typename或 / int , double ,char7函數(shù)模板實例函數(shù)模板實例-t1.cpp-t1.cpptemplate / template T Max(const T &a, const T &b) return a b ? a : b;n 括起部分就是模板的形參表,T是一個虛擬類型參數(shù)。注意,可以用多個虛擬參數(shù)構(gòu)成模板形參表。n 不但普通函數(shù)可以聲明為函數(shù)模板,類的成員函數(shù)也可以聲明為函數(shù)模板void main() cout “Max(15, 60) = Max(15, 60) endl; cout “Max(a, b) = Max(a, b) endl; co
4、ut “Max(1.2, 16.2) = Max(1.2, 16.2) endl;8模板形參模板形參n 類型形參 類型形參跟在關(guān)鍵字class或typename之后定義,如class T 是名為T的類型形參。template int compare(const T &v1, const T &v2);n 非類型形參 在調(diào)用函數(shù)時非類型形參將用值代替,值的類型在模板形參表中指定。非類型形參通常為定義模板內(nèi)部的常量值。template void sum(T data,T &result) result = 0; for(int i=0; irows; i+) result+=datai;9inli
5、neinline函數(shù)模板函數(shù)模板n inline函數(shù)模板中,inline說明符要放在模板參數(shù)列表之后,返回值之前,不能放在template關(guān)鍵字之前。template inline T fun(const T& a, const T& b);10模板形參限制(一)模板形參限制(一)n 模板形參作用域 模板形參的名字可以在聲明為模板形參之后直到模板聲明或定義的末尾處使用。typedef double T;template T fun(const T &a, const T &b) T tmp = a; return tmp;template T cacl(const T &a)11模板形參限制模
6、板形參限制(二)(二)n 使用模板形參名字的限制 模板形參的名字在同一模板形參表中只能使用一次,并且不能在模板內(nèi)部重定義。注意:不能出現(xiàn)如下定義template T fun(const T &a, const T &b) typedef double T; /Error! T tmp = a; return tmp;template T cacl(const T &a, const T &b)12模板形參限制模板形參限制(三)(三)n 模板聲明模板可以像其他函數(shù)一樣只聲明而不定義。在同一模板的聲明和定義中,模板形參名稱可以不同。template void fun(const T &);temp
7、late void fun(const T &);template void fun(const U &);template void fun(const V &a)13函數(shù)模板實例化函數(shù)模板實例化n 函數(shù)模板是模板函數(shù)的一個樣板,它可以生成多個重載的模板函數(shù),這些模板函數(shù)重用函數(shù)體代碼。模板函數(shù)是函數(shù)模板的一個實例。n 編譯系統(tǒng)將依據(jù)每一次對模板函數(shù)調(diào)用時實際所使用的數(shù)據(jù)類型生成適當(dāng)?shù)恼{(diào)用代碼,并生成相應(yīng)的函數(shù)版本。編譯系統(tǒng)生成函數(shù)模板的某個具體函數(shù)版本的過程稱為函數(shù)模板的實例化(instantiation),每一個實例就是一個函數(shù)定義。n 實例化的過程或結(jié)果通常是不可見的,編譯系統(tǒng)會根據(jù)函
8、數(shù)調(diào)用的具體情況自動傳遞相應(yīng)的模板實參,生成相應(yīng)的函數(shù)實例。14模板實參推斷模板實參推斷n 從函數(shù)實參確定模板實參類型和值的過程叫做模板實參推斷(template argument deduction)。n 實參推斷過程中可能出現(xiàn)的問題p從模板函數(shù)實參表獲得的信息有矛盾。 p需要獲得特定類型的返回值,而不管參數(shù)的類型如何。 p函數(shù)模板含有常規(guī)形參15模板實參推斷模板實參推斷(一)(一)n 模板函數(shù)實參表獲得的信息有矛盾n 解決辦法p當(dāng)實參表中有多個類型時,保證實參類型完全匹配。p指定顯示模板實參template T add(T a, T b)return a+b;int main()doubl
9、e a = 5.3;add(a, 100); /error: no matching add(double, int)return 0;add(a, 100); / add(int, int)16模板實參推斷模板實參推斷(二二)n 獲得特定類型的返回值引入新的模板形參表示返回值,并由調(diào)用者顯示指定由于顯示模板實參從左至右依次匹配,第一個模板實參與第一個模板形參相匹配,因此好的設(shè)計是將返回值類型設(shè)置為第一個模板形參template T1 add(T2 a, T3 b) return a + b;double v1 = add(452.8, 100);template T3 add(T2 a, T
10、1 b)long v2 = add(45.2, 100);17模板實參推斷模板實參推斷(三)(三)n 函數(shù)模板含有常規(guī)形參p當(dāng)模板含有常規(guī)形參時,如果常規(guī)參數(shù)的信息無法從模板函數(shù)的實參表中獲得,則在調(diào)用時必須顯式的給出對應(yīng)于常規(guī)參數(shù)的模板實參int main() int d3=1,2,3; int r; sum(d,r); coutsum=rendl; return 0;template sum(T data,T &result) result=0; for(int i=0;irows;i+) result += datai;18函數(shù)模板的重載函數(shù)模板的重載-t2.cpp-t2.cppn 函數(shù)
11、模板與函數(shù)模板、普通函數(shù)之間可以重載template T Func(T t) cout “Func(T)”endl; return t;templateT Func(int i,T t) cout “Func(int, T)”endl; return i*t;int Func(int t) cout “Func(int)”endl; return t;int main() cout Func(2.3); cout Func(5); cout Func(2.5, 5.3); cout Func(2, 42.4); return 0;結(jié)果是?19練習(xí)練習(xí)n 編寫一個冒泡排序法的函數(shù)模板,并針對不少
12、于三種類型進(jìn)行測試20類模板類模板n 為何要引進(jìn)類模板?p按不同的方式重用相同的代碼p使代碼參數(shù)化(通用化),即不受類型和操作的影響n 使用類模板所定義的一種類類型,類中的某些數(shù)據(jù)成員和某些成員函數(shù)的參數(shù)及返回值可以選取一定范圍內(nèi)的多種類型,從而實現(xiàn)代碼重用。n 是一種參數(shù)化類型的類,是類的生成器21引入類模板的優(yōu)勢引入類模板的優(yōu)勢template class Stackpublic: Stack(int = 10); Stack() delete stackPtr; bool push(const T&); bool pop(T&); bool isEmpty() return top =
13、-1; bool isFull() return top = size - 1; private: int size; int top; T* stackPtr;可以存放任何對象的棧22類模板的定義類模板的定義n 類模板的定義 template class 類名 /類的實現(xiàn)部分 ;n 模板參數(shù)表 class /typename 標(biāo)識符n 用類模板定義對象的格式是: 類名 對象名(構(gòu)造函數(shù)實參表); Stack sk;Stack stk(10);23類模板成員類模板成員n 類模板成員函數(shù)的定義 template 類型 類名:函數(shù)名(參數(shù)列表) /實現(xiàn)部分 templateStack:Stack(
14、int size)template int Stack:push(const T &i)template int Stack:pop(T &i)24練習(xí)練習(xí)n 編寫一個棧的類模板n 編寫一個環(huán)形緩沖區(qū)的類模板25類模板的派生與繼承類模板的派生與繼承n 繼承與派生方式p公有繼承p私有繼承p保護(hù)繼承n 訪問控制與一般的類一致n 常見繼承與派生情況p普通類繼承類模板 p模板類繼承普通類p模板類繼承模板類 p模板類繼承模板參數(shù)給出的基類 26普通類繼承類普通類繼承類模板模板n 普通類繼承類模板通過繼承類模板的一個實例來聲明一個類 templateclass Apublic: A()private: T
15、 data;class B:public A;27模板類繼承普通模板類繼承普通類類n 模板類繼承普通類class A;templateclass B:public Apublic: B()private: T data;28模板類繼承模板模板類繼承模板類類n 模板類繼承模板類templateclass Base T data1;templateclass Derived:public Base T2 data2;29模板類繼承模板參數(shù)給出的基類模板類繼承模板參數(shù)給出的基類 #includeusing namespace std;class BaseApublic: BaseA()coutBas
16、eA founedendl;class BaseBpublic: BaseB()coutBaseB founedendl;templateclass BaseCprivate: T data;public: BaseC(T n=value):data(n) coutBaseC founed dataendl;templateclass Derived:public Tpublic: Derived():T()coutDerived founedendl;int main() Derived x;/ BaseA作為基類 Derived y;/ BaseB作為基類 DerivedBaseC z;
17、/ BaseC作為基類30類的模板成員類的模板成員n 類的模板成員在類內(nèi)部與一般模板函數(shù)實現(xiàn)方法一致n 類的模板成員函數(shù),在類外部實現(xiàn)時必須包含所有模板的形參表templateclass Basepublic: template void fun(const V&);template template void Base:fun(const V &t)31STLSTL標(biāo)準(zhǔn)模板庫入門標(biāo)準(zhǔn)模板庫入門C+ STANDARD TEMPLATE LIBARARY32STLSTL概述概述n STL是C+標(biāo)準(zhǔn)程序庫的核心,深刻影響了標(biāo)準(zhǔn)程序庫的整體結(jié)構(gòu)n STL是泛型(generic)程序庫,利用先進(jìn)、高效
18、的算法來管理數(shù)據(jù)n STL由一些可適應(yīng)不同需求的集合類(collection class),以及在這些數(shù)據(jù)集合上操作的算法(algorithm)構(gòu)成n STL內(nèi)的所有組件都由模板(template)構(gòu)成,其元素可以是任意類型33STLSTL組件組件n 容器(Container) 管理某類對象的集合n 迭代器(Iterator) 在對象集合上進(jìn)行遍歷n 算法(Algorithm) 處理集合內(nèi)的元素 容器 Container 容器 Container容器Container算法Algorithm迭代器迭代器Iterator迭代器迭代器Iterator迭代器迭代器Iterator34STLSTL容器容
19、器類別類別n 序列式容器排列次序取決于插入時機和位置n 關(guān)聯(lián)式容器排列順序取決于特定準(zhǔn)則listdequevector序列式容器mapset關(guān)聯(lián)式容器35容器(容器(containercontainer)n 容器是用來保存數(shù)據(jù)的,是數(shù)據(jù)結(jié)構(gòu)類的總稱n 容器分為三種:p順序容器p關(guān)聯(lián)容器p容器適配器其中順序和關(guān)聯(lián)容器又統(tǒng)稱為第一類容器36STLSTL容器的共通容器的共通能力能力n 所有容器中存放的都是值而非引用,即容器進(jìn)行安插操作時內(nèi)部實施的是拷貝操作。因此容器的每個元素必須能夠被拷貝。如果希望存放的不是副本,容器元素只能是指針。n 所有元素都形成一個次序(order),可以按相同的次序一次或多
20、次遍歷每個元素n 各項操作并非絕對安全,調(diào)用者必須確保傳給操作函數(shù)的參數(shù)符合需求,否則會導(dǎo)致未定義的行為37STLSTL容器元素的容器元素的條件條件n 必須能夠通過拷貝構(gòu)造函數(shù)進(jìn)行復(fù)制n 必須可以通過賦值運算符完成賦值操作n 必須可以通過析構(gòu)函數(shù)完稱銷毀動作n 序列式容器元素的默認(rèn)構(gòu)造函數(shù)必須可用n 某些動作必須定義operator =,例如搜尋操作n 關(guān)聯(lián)式容器必須定義出排序準(zhǔn)則,默認(rèn)情況是重載operator 對于基本數(shù)據(jù)類型(int, long, char, double,)而言,以上條件總是滿足38STLSTL容器的共通容器的共通操作(一)操作(一)n 產(chǎn)生一個空容器n 以另一個容器元
21、素為初值完成初始化n 以數(shù)組元素為初值完成初始化std:list l;std:list l;std:vector c(l.begin(),l.end();int array=2,4,6,5;std:set c(array, array+sizeof(array)/sizeof(array0);39STLSTL容器的共通操作容器的共通操作(二)(二)n 與大小相關(guān)的操作(size operator)psize()返回當(dāng)前容器的元素數(shù)量pempty()判斷容器是否為空pmax_size()返回容器能容納的最大元素數(shù)量n 比較(comparison)p=,!=,=p比較操作兩端的容器必須屬于同一類型
22、p如果兩個容器內(nèi)的所有元素按序相等,那么這兩個容器相等p采用字典式順序判斷某個容器是否小于另一個容器n 賦值(assignment)和交換(swap)pswap用于提高賦值操作效率40STLSTL容器的共通操作容器的共通操作(三)(三)n 與迭代器(iterator)相關(guān)的操作pbegin()返回一個迭代器,指向第一個元素pend()返回一個迭代器,指向最后一個元素之后prbegin()返回一個逆向迭代器,指向逆向遍歷的第一個元素prend()返回一個逆向迭代器,指向逆向遍歷的最后一個元素之后n 元素操作pinsert(pos,e)將元素e的拷貝安插于迭代器pos所指的位置perase(beg
23、,end)移除beg,end區(qū)間內(nèi)的所有元素pclear()移除所有元素41迭代器(迭代器(iteratoriterator)n 可遍歷STL容器內(nèi)全部或部分元素的對象n 指出容器中的一個特定位置n 迭代器的基本操作操作效果*返回當(dāng)前位置上的元素值。如果該元素有成員,可以通過迭代器以operator -取用+將迭代器前進(jìn)至下一元素=和!=判斷兩個迭代器是否指向同一位置=為迭代器賦值(將所指元素的位置賦值過去)42迭代器迭代器n 所有容器都提供獲得迭代器的函數(shù)操作效果begin()返回一個迭代器,指向第一個元素end()返回一個迭代器,指向最后一個元素之后begin()end()半開區(qū)間beg,
24、 end)的好處:1.為遍歷元素時循環(huán)的結(jié)束時機提供了簡單的判斷依據(jù)(只要未到達(dá)end(),循環(huán)就可以繼續(xù))2.不必對空區(qū)間采取特殊處理(空區(qū)間的begin()就等于end())43迭代器迭代器n 所有容器都提供兩種迭代器pcontainer:iterator以“讀/寫”模式遍歷元素pcontainer:const_iterator以“只讀”模式遍歷元素n 迭代器示例:iteratorbegin()end() + pos44迭代器迭代器分類分類n 雙向迭代器p可以雙向行進(jìn),以遞增運算前進(jìn)或以遞減運算后退。plist、set和map提供雙向迭代器n 隨機存取迭代器p除了具備雙向迭代器的所有屬性,
25、還具備隨機訪問能力。p可以對迭代器增加或減少一個偏移量、處理迭代器之間的距離或者使用之類的關(guān)系運算符比較兩個迭代器。pvector、deque和string提供隨機存取迭代器HeadTailbeginrbeginrendend45v vectorector容器容器n vector模擬動態(tài)數(shù)組n vector的元素可以是任意類型T,但必須具備賦值和拷貝能力(具有public拷貝構(gòu)造函數(shù)和重載的賦值操作符)n 必須包含的頭文件#include n vector支持隨機存取n vector的大小(size)和容量(capacity)通常是不同的,size返回實際元素個數(shù),capacity返回vect
26、or能容納的元素最大數(shù)量。如果插入元素時,元素個數(shù)超過capacity,需要重新配置內(nèi)部存儲器。46vectorvector應(yīng)用實例應(yīng)用實例#include #include using namespace std;int main() const int SIZE =6; int aSIZE=1,2,3; vector v; coutthe initial size of v is: v.size() n the initial capacity of v is: v.capacity(); v.push_back(2); v.push_back(3); v.push_back(4); co
27、utn the size of v is: v.size() n the capacity of v is : v.capacity();Vector類的實例運行結(jié)果: the initial size of v is 0 the initial capacity of v is 0 the size of v is: 3 the capacity of v is: 447vectorvector應(yīng)用實例應(yīng)用實例 coutn contents of a using pointer notation:; for (int *ptr = a; ptr!=a+SIZE; +ptr ) cout *p
28、tr ; coutn contents of v using iterator notation:; vector:const_iterator p; for (p=v.begin(); p!=v.end(); p+) cout *p ; 運行結(jié)果: contents of a using pointer notation: 1 2 3 0 0 0 contents of v using iterator notation: 2 3 4通過迭代器訪問向量實例48vectorvector常見成員函數(shù)常見成員函數(shù) v.begin() 返回向量v中的第一個元素的迭代器v.end() 返回向量v中的最
29、后一個元素之后位置的迭代器v.rbegin() 返回向量v中倒數(shù)第一個元素的迭代器v.rend() 返回向量v中倒數(shù)最后一個元素之前的迭代器v3=8 第三個元素設(shè)置為8v.at(3) =8 第三個元素設(shè)置為8,檢查下標(biāo)越界v.insert(v.begin()+1, 22) 在第二個元素位置上插入22v.insert(v.begin(), a, a+SIZE) 將數(shù)組a開始SIZE個元素插入到v的前面位置上, 使得原來的首個元素成為第SIZE+1個元素v.erase(v.begin() 清除v中的第一個元素v.erase(v.begin(), v.end()清除v中的從第一個到結(jié)束標(biāo)志前的所有元
30、素 = v.clear() 清空所有元素49vectorvector容器容器n 構(gòu)造、拷貝和析構(gòu)操作效果vector c產(chǎn)生空的vectorvector c1(c2)產(chǎn)生同類型的c1,并將復(fù)制c2的所有元素vector c(n)利用類型T的默認(rèn)構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)生成一個大小為n的vectorvector c(n,e)產(chǎn)生一個大小為n的vector,每個元素都是evector c(beg,end)產(chǎn)生一個vector,以區(qū)間beg,end為元素初值vector()銷毀所有元素并釋放內(nèi)存50vectorvector容器容器n 非變動操作操作效果c.size()返回元素個數(shù)c.empty()判斷
31、容器是否為空c.max_size()返回元素最大可能數(shù)量(固定值)c.capacity()返回重新分配空間前可容納的最大元素數(shù)量c.reserve(n)擴大容量為nc1=c2判斷c1是否等于c2c1!=c2判斷c1是否不等于c2c1c2判斷c1是否大于c2c1=c2判斷c1是否小于等于c251vectorvector容器容器n 賦值操作操作效果c1 = c2將c2的全部元素賦值給c1c.assign(n,e)將元素e的n個拷貝賦值給cc.assign(beg,end)將區(qū)間beg;end的元素賦值給cc1.swap(c2)將c1和c2元素互換swap(c1,c2)同上,全局函數(shù) std:lis
32、t l; std:vector v; v.assign(l.begin(),l.end();所有的賦值操作都有可能調(diào)用元素類型的默認(rèn)構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值操作符和析構(gòu)函數(shù)52vectorvector容器容器n 元素存取操作效果at(idx)返回索引idx所標(biāo)識的元素,對idx進(jìn)行越界檢查operator (idx)返回索引idx所標(biāo)識的元素,對idx不進(jìn)行越界檢查front()返回第一個元素,不檢查第一個元素是否存在back()返回最后一個元素,不檢查最后一個元素是否存在std:vector v; /emptyv5= t;/runtime errorstd:cout v.front();
33、/runtime error53vectorvector容器容器n 迭代器相關(guān)函數(shù)操作效果begin()返回一個迭代器,指向第一個元素end()返回一個迭代器,指向最后一個元素之后rbegin()返回一個逆向迭代器,指向逆向遍歷的第一個元素rend()返回一個逆向迭代器,指向逆向遍歷的最后一個元素 迭代器持續(xù)有效,除非發(fā)生以下兩種情況:1. 刪除或插入元素2. 容量變化而引起內(nèi)存重新分配54vectorvector容器容器n 插入(insert)元素操作效果c.insert(pos,e)在pos位置插入元素e的副本,并返回新元素位置c.insert(pos,n,e)在pos位置插入n個元素e的
34、副本c.insert(pos,beg,end)在pos位置插入?yún)^(qū)間beg;end內(nèi)所有元素的副本c.push_back(e)在尾部添加一個元素e的副本55vectorvector容器容器n 移除(remove)元素操作效果c.pop_back()移除最后一個元素但不返回最后一個元素c.erase(pos)刪除pos位置的元素,返回下一個元素的位置c.erase(beg,end)刪除區(qū)間beg;end內(nèi)所有元素,返回下一個元素的位置c.clear()移除所有元素,清空容器c.resize(num)將元素數(shù)量改為num(增加的元素用defalut構(gòu)造函數(shù)產(chǎn)生,多余的元素被刪除)c.resize(n
35、um,e)將元素數(shù)量改為num(增加的元素是e的副本)56vectorvector容器容器n vector容器示例n 用vector容器實現(xiàn)Person類的異質(zhì)鏈表57dequedeque容器容器n deque模擬動態(tài)數(shù)組n deque的元素可以是任意類型T,但必須具備賦值和拷貝能力(具有public拷貝構(gòu)造函數(shù)和重載的賦值操作符)n 必須包含的頭文件#include n deque支持隨機存取n deque支持在頭部和尾部存儲數(shù)據(jù)n deque不支持capacity和reserve操作58listlist容器容器n 使用雙向鏈表管理元素n list的元素可以是任意類型T,但必須具備賦值和拷貝
36、能力n 必須包含的頭文件#include n list不支持隨機存取,因此不提供下標(biāo)操作符n 在任何位置上執(zhí)行元素的安插和移除都非??臁 插入和刪除不會導(dǎo)致指向其他元素的指針、引用、iterator失效。59總結(jié):順序容器總結(jié):順序容器順序容器類的共同特征:n 元素既然有順序就有順序號(索引號): 位置Pos,也就是可以通過順序號(索引號)訪問該元素 n 取得已知元素的順序號 n 在指定位置(順序號)處插入數(shù)據(jù)項 n 刪除指定項后的Count項,或刪除指定范圍中的數(shù)據(jù)項n front第一個元素引用n back最后一個元素引用n push_back 在容器尾部插入一個新元素n pop_back
37、 在容器尾部刪除一個元素60總結(jié):順序容器總結(jié):順序容器不同之處(各自的特長):vector: 從后面快速插入,刪除。直接訪問任何元素deque: 從前面或后面快速插入,刪除。 直接訪問任何元素list:從任何地方快速地插入,刪除。 訪問元素不太便利61map/map/multimapmultimap容器容器n 使用平衡二叉樹管理元素n 元素包含兩部分(key,value),key和value可以是任意類型n 必須包含的頭文件#include n 根據(jù)元素的key自動對元素排序,因此根據(jù)元素的key進(jìn)行定位很快,但根據(jù)元素的value定位很慢n 不能直接改變元素的key,可以通過operato
38、r 直接存取元素值n map中不允許key相同的元素,multimap允許key相同的元素62map/map/multimapmultimap容器容器n 內(nèi)部存儲結(jié)構(gòu)749258111361012yyxyqywxzyqz63容器(容器(containercontainer)n 容器是用來保存數(shù)據(jù)的,是數(shù)據(jù)結(jié)構(gòu)類的總稱n 容器分為三種:p順序容器p關(guān)聯(lián)容器p容器適配器其中順序和關(guān)聯(lián)容器又統(tǒng)稱為第一類容器64容器適配器容器適配器n 非第一類容器,其最大特點為不提供存放數(shù)據(jù)的實際數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)方法, 而是依賴于三種基礎(chǔ)的容器(順序容器)n 容器適配器不支持迭代器n 特別提供了pop, push 成員
39、函數(shù),實現(xiàn)刪除和插入的操作n 有三種容器適配器: pstack (后進(jìn)先出)pqueue (先進(jìn)先出)ppriority_queue(優(yōu)先級隊列)65stackstack容器容器n 后進(jìn)先出(LIFO)#include n 核心接口ppush(value)將元素壓棧ptop()返回棧頂元素,但不移除ppop()從棧中移除棧頂元素,但不返回n 實例:stackstacktop()pop()push()66s stacktack適配器適配器n stackp從基本數(shù)據(jù)結(jié)構(gòu)的尾部插入或刪除元素p后進(jìn)先出p可以用任意一種順序容器vector, list, deque實現(xiàn)p默認(rèn)情況下,stack用deque實現(xiàn)p頭文件pstack的操作:push()在stack頂端插入一個元素 (用基礎(chǔ)容器的push_back實現(xiàn))pop()從stack頂端刪除一個元素 (用基礎(chǔ)容器的pop_back實現(xiàn))top()取得stack頂上元素的引用 (用基礎(chǔ)容器的back實現(xiàn)) 67s stacktack的操作的操作n empty()確定stack是否為空 (用基礎(chǔ)容器的empty實現(xiàn))n size()取得stack的元素的個數(shù) (用基礎(chǔ)容器的size實現(xiàn))68s stacktack應(yīng)用實例應(yīng)用實例stack.c69queuequeue容器容器n 先進(jìn)先出(FIFO)#in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 縫紉機用針項目運營指導(dǎo)方案
- 煙草加工機產(chǎn)品供應(yīng)鏈分析
- 亞麻籽油膳食補充劑產(chǎn)品供應(yīng)鏈分析
- 給水加熱器工業(yè)用市場發(fā)展前景分析及供需格局研究預(yù)測報告
- 硅外延片產(chǎn)品供應(yīng)鏈分析
- 圖書出租行業(yè)經(jīng)營分析報告
- 家政人員招聘輔助行業(yè)經(jīng)營分析報告
- 個人用磨腳石產(chǎn)品供應(yīng)鏈分析
- 眼鏡商業(yè)機會挖掘與戰(zhàn)略布局策略研究報告
- 休養(yǎng)所行業(yè)營銷策略方案
- GB/T 39701-2020粉煤灰中銨離子含量的限量及檢驗方法
- 下肢深靜脈血栓靜脈濾器置入術(shù) 課件
- 全年級語文課件 - 小古文 疑鄰竊斧 全國通用
- DB31-T 1360-2022 民防工程安全管理工作導(dǎo)則
- 醫(yī)院管理系統(tǒng)需求規(guī)格說明書hexia
- 2022年無錫產(chǎn)業(yè)發(fā)展集團有限公司校園招聘筆試試題及答案解析
- 溢洪道設(shè)計與水力計算
- DB34-T 4007-2021特種設(shè)備作業(yè)人員職業(yè)技能培訓(xùn)機構(gòu)基本條件-高清現(xiàn)行
- 分?jǐn)?shù)的基本性質(zhì)【全國一等獎】-完整版課件
- 3500常用字(拼音與不帶拼音合并版)
- 部編本語文二年級上冊全冊各單元教材解讀
評論
0/150
提交評論