




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《STL泛型編程》PPT課件——探索C++標(biāo)準(zhǔn)模板庫(kù)的奧妙什么是STL?C++標(biāo)準(zhǔn)模板庫(kù)STL是C++標(biāo)準(zhǔn)模板庫(kù)(StandardTemplateLibrary)的縮寫(xiě),它是一組強(qiáng)大的C++模板類(lèi)和函數(shù),提供了一套通用的數(shù)據(jù)結(jié)構(gòu)和算法。泛型編程STL采用泛型編程的理念,這意味著其代碼可以獨(dú)立于特定數(shù)據(jù)類(lèi)型,適用于各種數(shù)據(jù)類(lèi)型,提高了代碼的可重用性和靈活性。STL的核心組件1容器容器用于存儲(chǔ)數(shù)據(jù),提供各種數(shù)據(jù)結(jié)構(gòu),如數(shù)組、列表、集合、映射等。2迭代器迭代器提供對(duì)容器元素的訪(fǎng)問(wèn)方式,允許遍歷容器中的元素,并進(jìn)行操作。3算法算法提供對(duì)容器中的數(shù)據(jù)進(jìn)行操作,如排序、查找、插入、刪除等。4函數(shù)對(duì)象函數(shù)對(duì)象允許將函數(shù)作為參數(shù)傳遞給算法,以便實(shí)現(xiàn)自定義行為。容器序列容器存儲(chǔ)元素的順序,例如:數(shù)組、向量、鏈表、雙端隊(duì)列。集合容器存儲(chǔ)元素的集合,例如:集合、映射。適配器對(duì)容器進(jìn)行包裝,以提供不同的接口,例如:堆棧、隊(duì)列、優(yōu)先隊(duì)列。迭代器1輸入迭代器只能讀取容器元素,一次只能讀取一個(gè)元素。2輸出迭代器只能寫(xiě)入容器元素,一次只能寫(xiě)入一個(gè)元素。3前向迭代器可以讀取和寫(xiě)入容器元素,只能向前遍歷。4雙向迭代器可以讀取和寫(xiě)入容器元素,可以向前或向后遍歷。5隨機(jī)訪(fǎng)問(wèn)迭代器可以讀取和寫(xiě)入容器元素,可以隨機(jī)訪(fǎng)問(wèn)任何位置的元素。算法變更序列操作容器中的元素順序,例如:排序、插入、刪除。查找在容器中查找特定元素,例如:find、search。排序?qū)θ萜髦械脑剡M(jìn)行排序,例如:sort、stable_sort。排列組合生成排列或組合,例如:next_permutation、prev_permutation。數(shù)值計(jì)算執(zhí)行數(shù)值計(jì)算,例如:accumulate、inner_product。集合操作執(zhí)行集合操作,例如:set_intersection、set_union。函數(shù)對(duì)象函數(shù)對(duì)象將函數(shù)行為封裝成對(duì)象,可以作為參數(shù)傳遞給算法。1自定義排序可以使用函數(shù)對(duì)象實(shí)現(xiàn)自定義排序規(guī)則,例如:根據(jù)特定條件對(duì)元素進(jìn)行排序。2Lambda表達(dá)式Lambda表達(dá)式提供一種簡(jiǎn)潔的方式來(lái)定義函數(shù)對(duì)象,使其更易于使用。3序列容器數(shù)組固定大小的連續(xù)內(nèi)存區(qū)域,用于存儲(chǔ)元素,可以通過(guò)索引訪(fǎng)問(wèn)元素。向量動(dòng)態(tài)大小的連續(xù)內(nèi)存區(qū)域,用于存儲(chǔ)元素,可以通過(guò)索引訪(fǎng)問(wèn)元素,并提供動(dòng)態(tài)內(nèi)存管理。鏈表元素存儲(chǔ)在節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的指針,提供高效的插入和刪除操作。雙端隊(duì)列可以從兩端插入和刪除元素,提供隊(duì)列和堆棧的功能。數(shù)組#include<array>std::array<int,5>arr={1,2,3,4,5};//訪(fǎng)問(wèn)元素intfirst=arr[0];//修改元素arr[1]=10;向量#include<vector>std::vector<int>vec={1,2,3};//插入元素vec.push_back(4);//刪除元素vec.erase(vec.begin()+1);//訪(fǎng)問(wèn)元素intthird=vec[2];鏈表#include<list>std::list<int>lst={1,2,3};//插入元素lst.insert(lst.begin(),0);//刪除元素lst.erase(lst.begin());//訪(fǎng)問(wèn)元素intfirst=lst.front();雙端隊(duì)列#include<deque>std::deque<int>deq={1,2,3};//從前面插入元素deq.push_front(0);//從后面刪除元素deq.pop_back();//訪(fǎng)問(wèn)元素intlast=deq.back();集合容器集合存儲(chǔ)唯一元素的集合,不保留元素的順序。映射存儲(chǔ)鍵值對(duì),每個(gè)鍵對(duì)應(yīng)一個(gè)唯一的值。集合#include<set>std::set<int>st={1,2,3,2};//重復(fù)元素會(huì)被忽略//插入元素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;//訪(fǎng)問(wèn)元素intappleCount=mp["apple"];適配器堆棧適配器對(duì)容器進(jìn)行包裝,提供后進(jìn)先出(LIFO)的接口。隊(duì)列適配器對(duì)容器進(jìn)行包裝,提供先進(jìn)先出(FIFO)的接口。優(yōu)先隊(duì)列適配器對(duì)容器進(jìn)行包裝,提供根據(jù)優(yōu)先級(jí)排序的接口。堆棧#include<stack>std::stack<int>stk;//壓棧stk.push(1);stk.push(2);//彈棧stk.pop();//獲取棧頂元素inttop=stk.top();隊(duì)列#include<queue>std::queue<int>que;//入隊(duì)que.push(1);que.push(2);//出隊(duì)que.pop();//獲取隊(duì)首元素intfront=que.front();優(yōu)先隊(duì)列#include<queue>//定義優(yōu)先隊(duì)列,使用大根堆排序std::priority_queue<int>pq;//插入元素pq.push(1);pq.push(3);pq.push(2);//獲取優(yōu)先級(jí)最高的元素inttop=pq.top();迭代器失效迭代器失效原因迭代器失效是指迭代器不再指向有效的內(nèi)存位置,通常發(fā)生在容器被修改時(shí),例如:插入、刪除元素。避免迭代器失效可以使用安全的迭代器,或者在修改容器后重新獲取迭代器。迭代器分類(lèi)1輸入迭代器只能讀取容器元素,一次只能讀取一個(gè)元素,用于單次遍歷。2輸出迭代器只能寫(xiě)入容器元素,一次只能寫(xiě)入一個(gè)元素,用于將元素寫(xiě)入容器。3前向迭代器可以讀取和寫(xiě)入容器元素,只能向前遍歷,用于單次遍歷和部分修改。4雙向迭代器可以讀取和寫(xiě)入容器元素,可以向前或向后遍歷,用于雙向遍歷和部分修改。5隨機(jī)訪(fǎng)問(wèn)迭代器可以讀取和寫(xiě)入容器元素,可以隨機(jī)訪(fǎng)問(wèn)任何位置的元素,用于高效的隨機(jī)訪(fǎng)問(wèn)和修改。輸入迭代器#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//輸入迭代器只能讀取元素,無(wú)法修改//*it=5;//編譯錯(cuò)誤return0;}輸出迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec(3);//初始化一個(gè)大小為3的向量std::vector<int>::iteratorit=vec.begin();//使用輸出迭代器寫(xiě)入元素*it=1;//寫(xiě)入第一個(gè)元素++it;//移動(dòng)到下一個(gè)位置*it=2;//寫(xiě)入第二個(gè)元素++it;//移動(dòng)到下一個(gè)位置*it=3;//寫(xiě)入第三個(gè)元素//輸出向量元素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;//修改第一個(gè)元素//使用前向迭代器向前遍歷++it;//移動(dòng)到下一個(gè)位置std::cout<<*it<<std::endl;//輸出:2//前向迭代器只能向前遍歷,無(wú)法向后遍歷//--it;//編譯錯(cuò)誤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;//修改第一個(gè)元素//使用雙向迭代器向前遍歷++it;//移動(dòng)到下一個(gè)位置std::cout<<*it<<std::endl;//輸出:2//使用雙向迭代器向后遍歷--it;//移動(dòng)到上一個(gè)位置std::cout<<*it<<std::endl;//輸出:5return0;}隨機(jī)訪(fǎng)問(wèn)迭代器#include<iostream>#include<vector>#include<iterator>intmain(){std::vector<int>vec={1,2,3};std::vector<int>::iteratorit=vec.begin();//使用隨機(jī)訪(fǎng)問(wèn)迭代器讀取元素std::cout<<*it<<std::endl;//輸出:1//使用隨機(jī)訪(fǎng)問(wèn)迭代器修改元素*it=5;//修改第一個(gè)元素//使用隨機(jī)訪(fǎng)問(wèn)迭代器隨機(jī)訪(fǎng)問(wèn)元素it+=2;//移動(dòng)到第三個(gè)位置std::cout<<*it<<std::endl;//輸出:3//使用隨機(jī)訪(fǎng)問(wèn)迭代器進(jìn)行比較if(it<vec.end()){//迭代器未到達(dá)容器末尾}return0;}算法概覽變更序列對(duì)容器中的元素進(jìn)行排序、插入、刪除等操作。查找在容器中查找特定元素,例如:find、search。排序?qū)θ萜髦械脑剡M(jìn)行排序,例如:sort、stable_sort。排列組合生成排列或組合,例如:next_permutation、prev_permutation。數(shù)值計(jì)算執(zhí)行數(shù)值計(jì)算,例如: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算法對(duì)向量進(jìn)行排序std::sort(vec.begin(),vec.end());//使用reverse算法對(duì)向量進(jìn)行反轉(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算法對(duì)向量進(jìn)行排序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算法生成下一個(gè)排列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ù)值計(jì)算#include<algorithm>#include<vector>#include<iostream>intmain(){std::vector<int>vec={1,2,3,4,5};//使用accumulate算法計(jì)算向量元素的總和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算法求兩個(gè)集合的交集std::set<int>intersection;std::set_intersection(set1.begin(),set1.end(),set2.begin(),set2.end(),std::inserter(intersection,intersection.begin()));//輸出交集std::cout<<"兩個(gè)集合的交集:"<<std::endl;for(inti:intersection){std::cout<<i<<"";//輸出:兩個(gè)集合的交集:345}std::cout<<std::endl;return0;}函數(shù)對(duì)象#include<iostream>#include<functional>//定義一個(gè)函數(shù)對(duì)象,用于計(jì)算兩個(gè)數(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ù)對(duì)象的應(yīng)用#include<algorithm>#include<vector>#include<functional>//定義一個(gè)函數(shù)對(duì)象,用于將元素值乘以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表達(dá)式#include<iostream>#include<functional>intmain(){//定義一個(gè)Lambda表達(dá)式,用于計(jì)算兩個(gè)數(shù)的和autoadd=[](inta,intb){returna+b;};intsum=add(5,3);std::cout<<"5+3="<<sum<<std::endl;//輸出:5+3=8return0;}使用函數(shù)對(duì)象實(shí)現(xiàn)自定義排序#include<algorithm>#include<vector>#include<iostream>//定義一個(gè)函數(shù)對(duì)象,用于根據(jù)元素的絕對(duì)值進(jìn)行排序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算法對(duì)向量進(jìn)行排序,使用AbsComparator作為比較器std::sort(vec.begin(),vec.end(),AbsComparator());//輸出排序后的向量for(inti:vec){std::cout<<i<<"";//輸出:-1-12345-56-9}return0;}容器適配器堆棧適配器使用容器(如向量、列表、雙端隊(duì)列)實(shí)現(xiàn)堆棧的功能。隊(duì)列適配器使用容器(如向量、列表、雙端隊(duì)列)實(shí)現(xiàn)隊(duì)列的功能。優(yōu)先隊(duì)列適配器使用容器(如向量、列表、雙端隊(duì)列)實(shí)現(xiàn)優(yōu)先隊(duì)列的功能。堆棧適配器#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;}隊(duì)列適配器#include<queue>#include<list>intmain(){//使用鏈表創(chuàng)建隊(duì)列std::queue<int,std::list<int>>que;//入隊(duì)que.push(1);que.push(2);//出隊(duì)que.pop();//獲取隊(duì)首元素intfront=que.front();return0;}優(yōu)先隊(duì)列適配器#include<queue>#include<vector>intmain(){//使用向量創(chuàng)建優(yōu)先隊(duì)列std::priority_queue<int,std::vector<int>,std::greater<int>>pq;//插入元素pq.push(1);pq.push(3);pq.push(2);//獲取優(yōu)先級(jí)最高的元素inttop=pq.top();return0;}STL的優(yōu)點(diǎn)1可擴(kuò)展性和靈活性STL提供了豐富的容器、算法和函數(shù)對(duì)象,可以滿(mǎn)足各種編程需求,并且可以輕松擴(kuò)展以滿(mǎn)足未來(lái)需求。2代碼復(fù)用和生產(chǎn)力STL的通用性使代碼可以輕松復(fù)用,減少代碼編寫(xiě)量,提高開(kāi)發(fā)效率。3性能優(yōu)化STL的算法和數(shù)據(jù)結(jié)構(gòu)經(jīng)過(guò)精心設(shè)計(jì),優(yōu)化了性能,提高了代碼執(zhí)行效率。可擴(kuò)展性和靈活
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西警官職業(yè)學(xué)院《影視藝術(shù)欣賞》2023-2024學(xué)年第二學(xué)期期末試卷
- 通遼職業(yè)學(xué)院《文化創(chuàng)意產(chǎn)業(yè)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西現(xiàn)代職業(yè)技術(shù)學(xué)院《動(dòng)物遺傳學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 昆明文理學(xué)院《書(shū)籍裝幀設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 建筑公司整體轉(zhuǎn)讓合同
- 農(nóng)民公寓買(mǎi)賣(mài)合同
- 臨時(shí)工聘用炊事員合同書(shū)
- 品牌形象代言合同
- 指定用途借款合同
- 實(shí)驗(yàn)室設(shè)備采購(gòu)合同
- 2025年高考作文備考訓(xùn)練:知足與進(jìn)取(附思路指引、立意參考、結(jié)構(gòu)建議、4篇范文示例)
- 2025年第33批 歐盟REACH SVHC高度關(guān)注物質(zhì)清單247項(xiàng)
- 2025年山東省東營(yíng)市廣饒縣一中中考一模英語(yǔ)試題(原卷版+解析版)
- 浙江省寧波市鎮(zhèn)海中學(xué)2024-2025學(xué)年高考二模英語(yǔ)試題試卷含解析
- 高校班干部培訓(xùn)
- 房 產(chǎn) 稅教學(xué)課件
- 地面推廣協(xié)議
- 雷雨劇本文件完整版電子書(shū)下載
- 采樣員筆試題庫(kù)及答案
- 2025年中國(guó)能源建設(shè)集團(tuán)湖南省電力設(shè)計(jì)院限公司校園招聘自考難、易點(diǎn)模擬試卷(共500題附帶答案詳解)
- 少兒海洋知識(shí)科普
評(píng)論
0/150
提交評(píng)論