版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
STL中的非線性容器Map容器map的結(jié)構(gòu)。map的操作。了解熟悉map的結(jié)構(gòu),并熟練掌握map的操作。2map將key/valuepair(鍵值/實(shí)值對組)當(dāng)作元素,進(jìn)行管理。它們可根據(jù)key的排序準(zhǔn)則自動將元素排序使用map之前,必須先包含頭文件<map>:#include<map>map被定義為命名空間std內(nèi)的classtemplates:namespacestd{template<classKey,classT,classCompare=less<Key>,classAllocator=allocator<pair<constKey,T>>>classmap; }6STL中的非線性容器6.1:map容器3第一個template參數(shù)被當(dāng)做元素的key,第二個template參數(shù)被當(dāng)做元素的value。第三個template參數(shù)可有可無,用來定義排序準(zhǔn)則。第四個template用來定義內(nèi)存模型。map的元素類型Key和T,必須滿足以下兩個條件:1)key/value必須具備可賦值和可復(fù)制的性質(zhì)。2)對排序準(zhǔn)則而言,key必須是可比較的。Map根據(jù)元素的key自動對元素進(jìn)行排序。根據(jù)已知的key搜尋某個元素時,就能夠有很好的性能,而根據(jù)已知value搜尋元素時,性能比較差。6STL中的非線性容器6.1:map容器4map的操作構(gòu)造、拷貝和析構(gòu)mapc產(chǎn)生一個空的map,其中不含任何元素mapc(op)以op為排序準(zhǔn)則,產(chǎn)生一個空的mapmapc1(c2)產(chǎn)生某個map的副本,所有元素均被復(fù)制mapc(beg,end)以區(qū)間[beg;end)內(nèi)的元素產(chǎn)生一個mapmapc(beg,end,op)以op為排序準(zhǔn)則,利用[beg;end)內(nèi)的元素生成一個mapc.~map()銷毀所有元素,釋放內(nèi)存6STL中的非線性容器6.1:map容器5有兩種方式可以定義排序準(zhǔn)則:1)以template參數(shù)定義。std::map<float,std::string,std::greater<float>>coll;2)以構(gòu)造函數(shù)參數(shù)定義。在這種情況下,可以有一個“排序準(zhǔn)則類型”并為它指定不同的排序準(zhǔn)則。如果使用者沒有提供特定排序準(zhǔn)則,就采用預(yù)設(shè)準(zhǔn)則——仿函數(shù)less<>。less<>是透過operator<對元素進(jìn)行排序。6STL中的非線性容器6.1:map容器6map<string,float>mShoolReport; mShoolReport["Tom"]=80;mShoolReport["Jack"]=89;mShoolReport["John"]=60;mShoolReport["Rose"]=50;產(chǎn)生mShoolReport的副本,所有元素均被復(fù)制map<string,float>mShoolReport2(mShoolReport);以區(qū)間[beg;end)內(nèi)的元素產(chǎn)生一個mapmap<string,float>mShoolReport3(mShoolReport2.begin(),mShoolReport2.end());6STL中的非線性容器6.1:map容器7非變動性操作c.size()返回容器的大小c.empty()判斷容器大小是否為零。等同于size()==0c.max_size()返回可容納的最大元素數(shù)量c1==c2判斷是否c1等于c2c1!=c2判斷是否c1不等于c2,等同于!(c1==c2)c1<c2判斷是否c1小于c2c1>c2判斷是否c1大于c2,等同于c2<c1c1<=c2判斷是否c1小于等于c2,等同于!(c2<c1)c1>=c2判斷是否c1大于等于c2,等同于!(c1<c2)6STL中的非線性容器6.1:map容器8元素間比較動作只能用于類型相同的容器。換言之,容器的key、value、排序準(zhǔn)則都必須有相同的類型,否則編譯期會產(chǎn)生類型方面的錯誤。std::map<float,std::string>c1;std::map<float,std::string,std::greater<float>>c2;...if(c1==c2){//ERROR:differenttypes...}6STL中的非線性容器6.1:map容器9特殊的搜尋動作成員函數(shù)find()用來搜尋擁有某個key的第一個元素,并返回一個迭代器,指向該位置。不能以find()搜尋擁有某特定value的元素,必須改用通用算法如find_if(),或直接寫一個循環(huán)。std::multimap<std::string,float>coll;std::multimap<std::string,float>::iteratorpos;for(pos=coll.begin();pos!=coll.end();++pos){ if(pos->second==value) {
……; }}6STL中的非線性容器6.1:map容器10map的特殊搜尋操作函數(shù)count(key)返回“鍵值等于key”的元素個數(shù)find(key)返回“鍵值等于key”的第一個元素,找不到就返回end()lower_bound(key)返回“鍵值為key”的元素的第一個可插入的位置,也就是“鍵值>=key”的第一個元素位置upper_bound(key)返回“鍵值為key”的元素的最后一個可插入的位置,也就是“鍵值>key”的第一個元素位置equal_range(key)返回“鍵值為key”的元素的第一個可插入位置和最后一個可插入位置,也就是“鍵值==key”的元素區(qū)間6STL中的非線性容器6.1:map容器11map<string,float>mShoolReport; mShoolReport["Tom"]=80;mShoolReport["Jack"]=89;mShoolReport["John"]=60;mShoolReport["Rose"]=50;map<string,float>::iteratorpos=mShoolReport.find("Jack");if(pos!=mShoolReport.end()){ cout<<"Key="<<pos->first<<'\t'<<"Value:" <<pos->second<<endl;}else cout<<"為此鍵值的元素不存在!"<<endl;6STL中的非線性容器6.1:map容器12賦值操作Map只支持所有容器都提供的基本指派操作操作功能c1=c2將c2中所有元素賦值給c1c1.swap(c2)將c1和c2的元素互換swap(c1,c2)同上。此為全局函數(shù)這些操作函數(shù)中,賦值動作的兩端容器中的元素必須具有相同類型。6STL中的非線性容器6.1:map容器13迭代器函數(shù)和元素存取map不支持元素直接存取,因此元素的存取通常是經(jīng)由迭代器進(jìn)行。不過有個例外:map提供下標(biāo)操作符,可直接存取元素函數(shù)功能c.begin()返回一個雙向迭代器(key被視為常數(shù)),指向第一個元素c.end()返回一個雙向迭代器(key被視為常數(shù)),指向最后元素的下一個位置c.rbegin()返回一個逆向迭代器,指向逆向遍歷時的第一個元素c.rend()返回一個逆向迭代器,指向逆向遍歷時的最后元素的下一個位置6STL中的非線性容器6.1:map容器14std::map<std::string,float>coll;...std::map<std::string,float>::iteratorpos;for(pos=coll.begin();pos!=coll.end();++pos){std::cout<<"key:"<<pos->first<<"\t"<<"value:"<<pos->second<<std::endl;}獲得元素的key:pos->first獲得元素的value:pos->second嘗試改變元素的key,會引發(fā)錯誤,改變value沒有問題:pos->first=“hello”; //錯誤pos->second=13.5;6STL中的非線性容器6.1:map容器15元素的插入和刪除c.insert(elem)插入一份elem副本c.insert(pos,elem)插入一份elem副本c.insert(beg,end)將區(qū)間[beg;end)內(nèi)所有元素的副本安插到c(無返回值)c.erase(elem)移除“key與elem相等”的所有元素,返回被移除的元素個數(shù)c.erase(pos)移除迭代器pos所指位置上的元素,無返回值c.erase(beg,end)移除區(qū)間[beg;end)內(nèi)的所有元素,無返回值c.clear()移除全部元素,將整個容器清空6STL中的非線性容器6.1:map容器16有3個不同的方法可以將value傳入map:1)運(yùn)用value_type。std::map<std::string,float>coll;...coll.insert(std::map<std::string,float>::value_type("otto",22.3));2)運(yùn)用pair<>。std::map<std::string,float>coll;...coll.insert(std::pair<std::string,float>("otto",22.3));coll.insert(std::pair<conststd::string,float>("otto",22.3));6STL中的非線性容器6.1:map容器17std::map<std::string,float>coll;...coll.insert(std::make_pair("otto",22.3));3)運(yùn)用make_pair()。如果要刪除“擁有某個value”的元素,調(diào)用erase()即可:std::map<std::string,float>coll;...coll.erase(key);m[key]返回一個引用,指向鍵值為key的元素。如果該元素尚未存在,就插入該元素map的直接元素存?。?STL中的非線性容器6.1:map容器18以數(shù)組的方式使用map對象的優(yōu)點(diǎn)是:可以透過更方便的接口對著map插入元素。std::map<std::string,float>coll;coll["otto"]=7.7;1)處理coll["otto"]:如果存在鍵值為"otto"的元素,以上式子返回該元素的引用。如果沒有任何元素的鍵值是"otto",以上式子便為map自動插入一個新元素,鍵值key為"otto",數(shù)據(jù)值value則以默認(rèn)構(gòu)造函數(shù)進(jìn)行構(gòu)造2)將數(shù)據(jù)7.7賦值給value:將數(shù)據(jù)7.7賦值給上述剛剛誕生的新元素。以數(shù)組的方式使用map對象,其缺點(diǎn)是:可能會不小心誤插入新元素。6STL中的非線性容器6.1:map容器19本節(jié)介紹了map的結(jié)構(gòu)與操作。map的元素都是“實(shí)值/鍵值”所形成的一個對組(key/valuepairs)。每個元素有一個鍵,是排序準(zhǔn)則的基礎(chǔ)。每一個鍵只能出現(xiàn)一次,不允許重復(fù)。選擇題(單選題)以下哪一個容器不可以用來表示線性表?(
)A.
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漆藝師變更管理水平考核試卷含答案
- 我國上市公司收益質(zhì)量的多維度實(shí)證剖析與提升路徑研究
- 我國上市公司并購事件對股票價格影響的實(shí)證剖析:基于多維度視角與案例研究
- 我國上市公司分紅制度:現(xiàn)狀、問題與完善路徑探究
- 裝訂工安全操作競賽考核試卷含答案
- 有機(jī)合成工崗前合規(guī)化考核試卷含答案
- 塑料熱合工安全培訓(xùn)水平考核試卷含答案
- 軟體家具制作工安全操作強(qiáng)化考核試卷含答案
- 老年粉塵暴露者慢性咳嗽的綜合干預(yù)策略
- 織布機(jī)操作工崗前工作合規(guī)考核試卷含答案
- T∕CECS10283-2023建筑用覆鋁膜隔熱金屬板
- 員工個人成長經(jīng)歷分享
- 自平衡多級泵培訓(xùn)課件
- 晝夜明暗圖課件
- 壓力性尿失禁教學(xué)課件
- 凝血六項(xiàng)課件
- 公路施工監(jiān)理工作重點(diǎn)及難點(diǎn)分析
- 2025云南昆明公交集團(tuán)招聘9人筆試歷年備考題庫附帶答案詳解2套試卷
- 雨課堂在線學(xué)堂《大數(shù)據(jù)技術(shù)與應(yīng)用》作業(yè)單元考核答案
- 光伏電纜專業(yè)知識培訓(xùn)課件
- 養(yǎng)牛場消防知識培訓(xùn)
評論
0/150
提交評論