《STL泛型編程》課件-探索C++標準模板庫的奧妙_第1頁
《STL泛型編程》課件-探索C++標準模板庫的奧妙_第2頁
《STL泛型編程》課件-探索C++標準模板庫的奧妙_第3頁
《STL泛型編程》課件-探索C++標準模板庫的奧妙_第4頁
《STL泛型編程》課件-探索C++標準模板庫的奧妙_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

《STL泛型編程》PPT課件——探索C++標準模板庫的奧妙什么是STL?C++標準模板庫STL是C++標準模板庫(StandardTemplateLibrary)的縮寫,它是一組強大的C++模板類和函數(shù),提供了一套通用的數(shù)據(jù)結(jié)構(gòu)和算法。泛型編程STL采用泛型編程的理念,這意味著其代碼可以獨立于特定數(shù)據(jù)類型,適用于各種數(shù)據(jù)類型,提高了代碼的可重用性和靈活性。STL的核心組件1容器容器用于存儲數(shù)據(jù),提供各種數(shù)據(jù)結(jié)構(gòu),如數(shù)組、列表、集合、映射等。2迭代器迭代器提供對容器元素的訪問方式,允許遍歷容器中的元素,并進行操作。3算法算法提供對容器中的數(shù)據(jù)進行操作,如排序、查找、插入、刪除等。4函數(shù)對象函數(shù)對象允許將函數(shù)作為參數(shù)傳遞給算法,以便實現(xiàn)自定義行為。容器序列容器存儲元素的順序,例如:數(shù)組、向量、鏈表、雙端隊列。集合容器存儲元素的集合,例如:集合、映射。適配器對容器進行包裝,以提供不同的接口,例如:堆棧、隊列、優(yōu)先隊列。迭代器1輸入迭代器只能讀取容器元素,一次只能讀取一個元素。2輸出迭代器只能寫入容器元素,一次只能寫入一個元素。3前向迭代器可以讀取和寫入容器元素,只能向前遍歷。4雙向迭代器可以讀取和寫入容器元素,可以向前或向后遍歷。5隨機訪問迭代器可以讀取和寫入容器元素,可以隨機訪問任何位置的元素。算法變更序列操作容器中的元素順序,例如:排序、插入、刪除。查找在容器中查找特定元素,例如:find、search。排序?qū)θ萜髦械脑剡M行排序,例如:sort、stable_sort。排列組合生成排列或組合,例如:next_permutation、prev_permutation。數(shù)值計算執(zhí)行數(shù)值計算,例如:accumulate、inner_product。集合操作執(zhí)行集合操作,例如:set_intersection、set_union。函數(shù)對象函數(shù)對象將函數(shù)行為封裝成對象,可以作為參數(shù)傳遞給算法。1自定義排序可以使用函數(shù)對象實現(xiàn)自定義排序規(guī)則,例如:根據(jù)特定條件對元素進行排序。2Lambda表達式Lambda表達式提供一種簡潔的方式來定義函數(shù)對象,使其更易于使用。3序列容器數(shù)組固定大小的連續(xù)內(nèi)存區(qū)域,用于存儲元素,可以通過索引訪問元素。向量動態(tài)大小的連續(xù)內(nèi)存區(qū)域,用于存儲元素,可以通過索引訪問元素,并提供動態(tài)內(nèi)存管理。鏈表元素存儲在節(jié)點中,每個節(jié)點包含數(shù)據(jù)和指向下一個節(jié)點的指針,提供高效的插入和刪除操作。雙端隊列可以從兩端插入和刪除元素,提供隊列和堆棧的功能。數(shù)組#include<array>std::array<int,5>arr={1,2,3,4,5};//訪問元素intfirst=arr[0];//修改元素arr[1]=10;向量#include<vector>std::vector<int>vec={1,2,3};//插入元素vec.push_back(4);//刪除元素vec.erase(vec.begin()+1);//訪問元素intthird=vec[2];鏈表#include<list>std::list<int>lst={1,2,3};//插入元素lst.insert(lst.begin(),0);//刪除元素lst.erase(lst.begin());//訪問元素intfirst=lst.front();雙端隊列#include<deque>std::deque<int>deq={1,2,3};//從前面插入元素deq.push_front(0);//從后面刪除元素deq.pop_back();//訪問元素intlast=deq.back();集合容器集合存儲唯一元素的集合,不保留元素的順序。映射存儲鍵值對,每個鍵對應(yīng)一個唯一的值。集合#include<set>std::set<int>st={1,2,3,2};//重復(fù)元素會被忽略//插入元素st.insert(4);//刪除元素st.erase(2);//檢查元素是否存在boolcontains=st.count(3);映射#include<map>std::map<std::string,int>mp={{"apple",1},{"banana",2}};//插入元素mp["orange"]=3;//修改元素mp["banana"]=5;//訪問元素intappleCount=mp["apple"];適配器堆棧適配器對容器進行包裝,提供后進先出(LIFO)的接口。隊列適配器對容器進行包裝,提供先進先出(FIFO)的接口。優(yōu)先隊列適配器對容器進行包裝,提供根據(jù)優(yōu)先級排序的接口。堆棧#include<stack>std::stack<int>stk;//壓棧stk.push(1);stk.push(2);//彈棧stk.pop();//獲取棧頂元素inttop=stk.top();隊列#include<queue>std::queue<int>que;//入隊que.push(1);que.push(2);//出隊que.pop();//獲取隊首元素intfront=que.front();優(yōu)先隊列#include<queue>//定義優(yōu)先隊列,使用大根堆排序std::priority_queue<int>pq;//插入元素pq.push(1);pq.push(3);pq.push(2);//獲取優(yōu)先級最高的元素inttop=pq.top();迭代器失效迭代器失效原因迭代器失效是指迭代器不再指向有效的內(nèi)存位置,通常發(fā)生在容器被修改時,例如:插入、刪除元素。避免迭代器失效可以使用安全的迭代器,或者在修改容器后重新獲取迭代器。迭代器分類1輸入迭代器只能讀取容器元素,一次只能讀取一個元素,用于單次遍歷。2輸出迭代器只能寫入容器元素,一次只能寫入一個元素,用于將元素寫入容器。3前向迭代器可以讀取和寫入容器元素,只能向前遍歷,用于單次遍歷和部分修改。4雙向迭代器可以讀取和寫入容器元素,可以向前或向后遍歷,用于雙向遍歷和部分修改。5隨機訪問迭代器可以讀取和寫入容器元素,可以隨機訪問任何位置的元素,用于高效的隨機訪問和修改。輸入迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec={1,2,3};std::vector<int>::iteratorit=vec.begin();//使用輸入迭代器讀取元素std::cout<<*it<<std::endl;//輸出:1//輸入迭代器只能讀取元素,無法修改//*it=5;//編譯錯誤return0;}輸出迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec(3);//初始化一個大小為3的向量std::vector<int>::iteratorit=vec.begin();//使用輸出迭代器寫入元素*it=1;//寫入第一個元素++it;//移動到下一個位置*it=2;//寫入第二個元素++it;//移動到下一個位置*it=3;//寫入第三個元素//輸出向量元素for(inti:vec){std::cout<<i<<"";//輸出:123}return0;}前向迭代器#include<iostream>#include<list>#include<iterator>intmain(){std::list<int>lst={1,2,3};std::list<int>::iteratorit=lst.begin();//使用前向迭代器讀取元素std::cout<<*it<<std::endl;//輸出:1//使用前向迭代器修改元素*it=5;//修改第一個元素//使用前向迭代器向前遍歷++it;//移動到下一個位置std::cout<<*it<<std::endl;//輸出:2//前向迭代器只能向前遍歷,無法向后遍歷//--it;//編譯錯誤return0;}雙向迭代器#include<iostream>#include<list>#include<iterator>intmain(){std::list<int>lst={1,2,3};std::list<int>::iteratorit=lst.begin();//使用雙向迭代器讀取元素std::cout<<*it<<std::endl;//輸出:1//使用雙向迭代器修改元素*it=5;//修改第一個元素//使用雙向迭代器向前遍歷++it;//移動到下一個位置std::cout<<*it<<std::endl;//輸出:2//使用雙向迭代器向后遍歷--it;//移動到上一個位置std::cout<<*it<<std::endl;//輸出:5return0;}隨機訪問迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec={1,2,3};std::vector<int>::iteratorit=vec.begin();//使用隨機訪問迭代器讀取元素std::cout<<*it<<std::endl;//輸出:1//使用隨機訪問迭代器修改元素*it=5;//修改第一個元素//使用隨機訪問迭代器隨機訪問元素it+=2;//移動到第三個位置std::cout<<*it<<std::endl;//輸出:3//使用隨機訪問迭代器進行比較if(it<vec.end()){//迭代器未到達容器末尾}return0;}算法概覽變更序列對容器中的元素進行排序、插入、刪除等操作。查找在容器中查找特定元素,例如:find、search。排序?qū)θ萜髦械脑剡M行排序,例如:sort、stable_sort。排列組合生成排列或組合,例如:next_permutation、prev_permutation。數(shù)值計算執(zhí)行數(shù)值計算,例如:accumulate、inner_product。集合操作執(zhí)行集合操作,例如:set_intersection、set_union。變更序列#include<algorithm>#include<vector>intmain(){std::vector<int>vec={3,1,4,1,5,9,2,6,5};//使用sort算法對向量進行排序std::sort(vec.begin(),vec.end());//使用reverse算法對向量進行反轉(zhuǎn)std::reverse(vec.begin(),vec.end());//使用unique算法去除重復(fù)元素std::unique(vec.begin(),vec.end());//使用erase算法刪除元素vec.erase(std::unique(vec.begin(),vec.end()),vec.end());return0;}查找#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3,4,5};//使用find算法查找元素3std::vector<int>::iteratorit=std::find(vec.begin(),vec.end(),3);if(it!=vec.end()){std::cout<<"元素3在向量中的位置:"<<std::distance(vec.begin(),it)<<std::endl;//輸出:元素3在向量中的位置:2}else{std::cout<<"向量中不存在元素3"<<std::endl;}return0;}排序#include<algorithm>#include<vector>intmain(){std::vector<int>vec={3,1,4,1,5,9,2,6,5};//使用sort算法對向量進行排序std::sort(vec.begin(),vec.end());//輸出排序后的向量for(inti:vec){std::cout<<i<<"";//輸出:112345569}return0;}排列組合#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3};//使用next_permutation算法生成下一個排列do{for(inti:vec){std::cout<<i<<"";//輸出:123,132,213,231,312,321}std::cout<<std::endl;}while(std::next_permutation(vec.begin(),vec.end()));return0;}數(shù)值計算#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3,4,5};//使用accumulate算法計算向量元素的總和intsum=std::accumulate(vec.begin(),vec.end(),0);std::cout<<"向量元素的總和:"<<sum<<std::endl;//輸出:向量元素的總和:15return0;}集合操作#include<algorithm>#include<set>#include<iostream>intmain(){std::set<int>set1={1,2,3,4,5};std::set<int>set2={3,4,5,6,7};//使用set_intersection算法求兩個集合的交集std::set<int>intersection;std::set_intersection(set1.begin(),set1.end(),set2.begin(),set2.end(),std::inserter(intersection,intersection.begin()));//輸出交集std::cout<<"兩個集合的交集:"<<std::endl;for(inti:intersection){std::cout<<i<<"";//輸出:兩個集合的交集:345}std::cout<<std::endl;return0;}函數(shù)對象#include<iostream>#include<functional>//定義一個函數(shù)對象,用于計算兩個數(shù)的和classAdd{public:intoperator()(inta,intb){returna+b;}};intmain(){Addadd;intsum=add(5,3);std::cout<<"5+3="<<sum<<std::endl;//輸出:5+3=8return0;}函數(shù)對象的應(yīng)用#include<algorithm>#include<vector>#include<functional>//定義一個函數(shù)對象,用于將元素值乘以2classMultiplyByTwo{public:intoperator()(inta){returna*2;}};intmain(){std::vector<int>vec={1,2,3,4,5};//使用transform算法將向量元素值乘以2std::transform(vec.begin(),vec.end(),vec.begin(),MultiplyByTwo());//輸出修改后的向量for(inti:vec){std::cout<<i<<"";//輸出:246810}return0;}Lambda表達式#include<iostream>#include<functional>intmain(){//定義一個Lambda表達式,用于計算兩個數(shù)的和autoadd=[](inta,intb){returna+b;};intsum=add(5,3);std::cout<<"5+3="<<sum<<std::endl;//輸出:5+3=8return0;}使用函數(shù)對象實現(xiàn)自定義排序#include<algorithm>#include<vector>#include<iostream>//定義一個函數(shù)對象,用于根據(jù)元素的絕對值進行排序classAbsComparator{public:booloperator()(inta,intb){returnstd::abs(a)<std::abs(b);}};intmain(){std::vector<int>vec={3,-1,4,-1,5,-9,2,6,-5};//使用sort算法對向量進行排序,使用AbsComparator作為比較器std::sort(vec.begin(),vec.end(),AbsComparator());//輸出排序后的向量for(inti:vec){std::cout<<i<<"";//輸出:-1-12345-56-9}return0;}容器適配器堆棧適配器使用容器(如向量、列表、雙端隊列)實現(xiàn)堆棧的功能。隊列適配器使用容器(如向量、列表、雙端隊列)實現(xiàn)隊列的功能。優(yōu)先隊列適配器使用容器(如向量、列表、雙端隊列)實現(xiàn)優(yōu)先隊列的功能。堆棧適配器#include<stack>#include<vector>intmain(){//使用向量創(chuàng)建堆棧std::stack<int,std::vector<int>>stk;//壓棧stk.push(1);stk.push(2);//彈棧stk.pop();//獲取棧頂元素inttop=stk.top();return0;}隊列適配器#include<queue>#include<list>intmain(){//使用鏈表創(chuàng)建隊列std::queue<int,std::list<int>>que;//入隊que.push(1);que.push(2);//出隊que.pop();//獲取隊首元素intfront=que.front();return0;}優(yōu)先隊列適配器#include<queue>#include<vector>intmain(){//使用向量創(chuàng)建優(yōu)先隊列std::priority_queue<int,std::vector<int>,std::greater<int>>pq;//插入元素pq.push(1);pq.push(3);pq.push(2);//獲取優(yōu)先級最高的元素inttop=pq.top();return0;}STL的優(yōu)點1可擴展性和靈活性STL提供了豐富的容器、算法和函數(shù)對象,可以滿足各種編程需求,并且可以輕松擴展以滿足未來需求。2代碼復(fù)用和生產(chǎn)力STL的通用性使代碼可以輕松復(fù)用,減少代碼編寫量,提高開發(fā)效率。3性能優(yōu)化STL的算法和數(shù)據(jù)結(jié)構(gòu)經(jīng)過精心設(shè)計,優(yōu)化了性能,提高了代碼執(zhí)行效率??蓴U展性和靈活

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論