




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++深入分析STL中map容器的使用目錄1、map容器2、map容器原理3、map容器函數(shù)接口4、使用示例
1、map容器
map是C++STL的一個(gè)關(guān)聯(lián)容器,它提供一對(duì)一的數(shù)據(jù)處理能力。其中,各個(gè)鍵值對(duì)的鍵和值可以是任意數(shù)據(jù)類型,包括C++基本數(shù)據(jù)類型(int、double等)、使用結(jié)構(gòu)體或類自定義的類型。
第一個(gè)可以稱為關(guān)鍵字(key);
第二個(gè)可能稱為該關(guān)鍵字的值(value);
該容器存儲(chǔ)的都是pairconstK,T類型(其中K和T分別表示鍵和值的數(shù)據(jù)類型)的鍵值對(duì)元素。
使用map容器存儲(chǔ)的各個(gè)鍵值對(duì),鍵的值既不能重復(fù)也不能被修改。換句話說(shuō),map容器中存儲(chǔ)的各個(gè)鍵值對(duì)不僅鍵的值獨(dú)一無(wú)二,鍵的類型也會(huì)用const修飾,這意味著只要鍵值對(duì)被存儲(chǔ)到map容器中,其鍵的值將不能再做任何修改。
2、map容器原理
map容器的實(shí)現(xiàn)是自建了一顆紅黑樹(shù),這顆樹(shù)具有對(duì)數(shù)據(jù)自動(dòng)排序的功能,在map內(nèi)部所有的數(shù)據(jù)都是有序的
3、map容器函數(shù)接口
begin()返回指向map頭部的迭代器
clear()刪除所有元素
count()返回指定元素出現(xiàn)的次數(shù)
empty()如果map為空則返回true
end()返回指向map末尾的迭代器
equal_range()返回特殊條目的迭代器對(duì)
erase()刪除一個(gè)元素
find()查找一個(gè)元素
get_allocator()返回map的配置器
insert()插入元素
key_comp()返回比較元素key的函數(shù)
lower_bound()返回鍵值=給定元素的第一個(gè)位置
max_size()返回可以容納的最大元素個(gè)數(shù)
rbegin()返回一個(gè)指向map尾部的逆向迭代器
rend()返回一個(gè)指向map頭部的逆向迭代器
size()返回map中元素的個(gè)數(shù)
swap()交換兩個(gè)map
upper_bound()返回鍵值給定元素的第一個(gè)位置
value_comp()返回比較元素value的函數(shù)
mapkey,value//創(chuàng)建一個(gè)名為m的空map對(duì)象,其鍵和值的類型分別為key和value。
mapkey,valuem(m2);//創(chuàng)建m2的副本m,m與m2必須有相同的鍵類型和值類型。
mapkey,valuem(b,e);//創(chuàng)建map類型的對(duì)象m,存儲(chǔ)迭代器b和e標(biāo)記的范圍內(nèi)所有元素的副本,元素的類型必須能轉(zhuǎn)換為pair
//查
m.count(k);//返回m中鍵值等于k的元素的個(gè)數(shù)。
m.find(k);//如果m中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回結(jié)束游標(biāo)end()。
//刪
//迭代器刪除
iter=m.find(123
m.erase(iter);
//用關(guān)鍵字刪除
intn=m.erase(123//如果刪除了會(huì)返回1,否則返回0
//用迭代器范圍刪除:把整個(gè)map清空
m.erase(m.begin(),m.end());
//等同于m.clear()
m.erase(k);//刪除m中鍵為k的元素,返回size_type類型的值,表示刪除元素的個(gè)數(shù)。
m.erase(p);//從m中刪除迭代器p所指向的元素,p必須指向m中確實(shí)存在的元素,而且不能等于m.end(),返回void類型。
m.erase(iteratorfirst,iteratorlast);//刪除一個(gè)范圍,返回void類型。
//插入
//第一種用insert函數(shù)插入pair
m.insert(pairint,string(000,student_zero));
//第二種用insert函數(shù)插入value_type數(shù)據(jù)
m.insert(mapint,string::value_type(001,student_one));
//第三種用array方式插入
m[123]=student_first
m[456]=student_second
m.insert(e);
e是一個(gè)用在m上的value_type類型的值。如果鍵e.first不在m中,則插入一個(gè)值為e.second的新元素;如果該鍵在m中已存在,那么不進(jìn)行任何操作。該函數(shù)返回一個(gè)pair類型對(duì)象,包含指向鍵為e.first的元素的map迭代器,以及一個(gè)bool類型的對(duì)象,表示是否插入了該元素。
m.insert(beg,end);
beg和end是標(biāo)記元素范圍的迭代器,對(duì)于該范圍內(nèi)的所有元素,如果它的鍵在m中不存在,則將該鍵及其關(guān)聯(lián)的值插入到m。返回void類型。
m.insert(iter,e);
e是value_type類型的值,如果e.first不在m中,則創(chuàng)建新元素,并以迭代器iter為起點(diǎn)搜索新元素存儲(chǔ)的位置,返回一個(gè)迭代器,指向m中具有給定鍵的元素。在添加新的map元素時(shí),使用insert成員可避免使用下標(biāo)操作符帶來(lái)的副作用:不必要的初始化。
//在往map里面插入了數(shù)據(jù),我們?cè)趺粗喇?dāng)前已經(jīng)插入了多少數(shù)據(jù)呢,可以用size函數(shù),用法如下:intnSize=mapStudent.size();
pairmapint,string::iterator,boolInsert_Pair;
Insert_Pair=mapStudent.insert(mapint,string::value_type(1,student_one));
我們通過(guò)pair的第二個(gè)變量來(lái)知道是否插入成功,它的第一個(gè)變量返回的是一個(gè)map的迭代器,如果插入成功的話Insert_Pair.second應(yīng)該是true的,否則為false。
4、使用示例
(1)插入
insert函數(shù)插入pair數(shù)據(jù)
std::mapint,std::stringmapPerson;
mapPerson.insert(pairint,string(1,Jim));
insert函數(shù)插入value_type數(shù)據(jù)
mapPerson.insert(std::mapint,std::string::value_type(2,Tom));
用數(shù)組方式插入數(shù)據(jù)
mapPerson[3]=Jerry
(2)遍歷
前向迭代器
std::mapint,std::string::iteratorit;
std::mapint,std::string::iteratoritEnd;
it=mapPerson.begin();
itEnd=mapPerson.end();
while(it!=itEnd)
coutit-first''it-secondendl;
it++;
}
反向迭代器
std::mapint,string::reverse_iteratoriter;
for(iter=mapPerson.rbegin();iter!=mapPerson.rend();iter++)
coutiter-first""iter-secondendl;
數(shù)組形式
mapPerson.insert(std::mapint,std::string::value_type(1,"Tom"));
mapPerson[2]="Jim";
mapPerson[3]="Jerry";
intnSize=mapPerson.size();
for(intn=1;n=nSize;n++)
qDebug()QString::fromStdString(mapPerson[n]);
(3)查找
三種數(shù)據(jù)查找方法
第一種:用count函數(shù)來(lái)判定關(guān)鍵字是否出現(xiàn),其缺點(diǎn)是無(wú)法定位數(shù)據(jù)出現(xiàn)位置,由于map的特性,一對(duì)一的映射關(guān)系,就決定了count函數(shù)的返回值只有兩個(gè),要么是0,要么是1,出現(xiàn)的情況,當(dāng)然是返回1了
第二種:用find函數(shù)來(lái)定位數(shù)據(jù)出現(xiàn)位置,它返回的一個(gè)迭代器,當(dāng)數(shù)據(jù)出現(xiàn)時(shí),它返回?cái)?shù)據(jù)所在位置的迭代器,如果map中沒(méi)有要查找的數(shù)據(jù),它返回的迭代器等于end函數(shù)返回的迭代器。
查找map中是否包含某個(gè)關(guān)鍵字條目用find()方法,傳入的參數(shù)是要查找的key,在這里需要提到的是begin()和end()兩個(gè)成員,
分別代表map對(duì)象中第一個(gè)條目和最后一個(gè)條目,這兩個(gè)數(shù)據(jù)的類型是iterator.
通過(guò)map對(duì)象的方法獲取的iterator數(shù)據(jù)類型是一個(gè)std::pair對(duì)象,包括兩個(gè)數(shù)據(jù)iterator-first和iterator-second分別代表關(guān)鍵字和存儲(chǔ)的數(shù)據(jù)。
mapint,string::iteratorl_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout"wedonotfind112"endl;
elsecout"wofind112"endl;
第三種:這個(gè)方法用來(lái)判定數(shù)據(jù)是否出現(xiàn),是顯得笨了點(diǎn),
lower_bound函數(shù)用法,這個(gè)函數(shù)用來(lái)返回要查找關(guān)鍵字的下界(是一個(gè)迭代器)
upper_bound函數(shù)用法,這個(gè)函數(shù)用來(lái)返回要查找關(guān)鍵字的上界(是一個(gè)迭代器)
例如:map中已經(jīng)插入了1,2,3,4的話,如果lower_bound(2)的話,返回的2,
而upper-bound(2)的話,返回的就是3
Equal_range函數(shù)返回一個(gè)pair,pair里面第一個(gè)變量是Lower_bound返回的迭代器,pair里面第二個(gè)迭代器是Upper_bound返回的迭代器,如果這兩個(gè)迭代器相等的話,則說(shuō)明map中不出現(xiàn)這個(gè)關(guān)鍵字,
#includemap
#includestring
#includeiostream
usingnamespacestd;
intmain()
mapint,stringmapStudent;
mapStudent[1]="student_one";
mapStudent[3]="student_three";
mapStudent[5]="student_five";
mapint,string::iteratoriter;
iter=mapStudent.lower_bound(1);
//返回的是下界1的迭代器
coutiter-secondendl;
iter=mapStudent.lower_bound(2);
//返回的是下界3的迭代器
coutiter-secondendl;
iter=mapStudent.lower_bound(3);
//返回的是下界3的迭代器
coutiter-secondendl;
iter=mapStudent.upper_bound(2);
//返回的是上界3的迭代器
coutiter-secondendl;
iter=mapStudent.upper_bound(3);
//返回的是上界5的迭代器
coutiter-secondendl;
pairmapint,string::iterator,mapint,string::iteratormappair;
mappair=mapStudent.equal_range(2);
if(mappair.first==mappair.second)
cout"DonotFind"endl;
else
cout"Find"endl;
mappair=mapStudent.equal_range(3);
if(mappair.first==mappair.secon
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 62425:2025 CMV EN Railway applications - Communication,signalling and processing systems - Safety related electronic systems for signalling
- 國(guó)際貿(mào)易實(shí)務(wù)模擬試題(附答案)
- 養(yǎng)殖業(yè)廢棄物處理服務(wù)合同
- 社區(qū)合作社種植產(chǎn)品收購(gòu)與銷售協(xié)議
- 企業(yè)年度銷售代理協(xié)議
- 家用電器購(gòu)買安裝合同
- 2025陜西西鳳露酒有限公司招聘(38人)筆試參考題庫(kù)附帶答案詳解
- 2025年山東土地資本投資集團(tuán)有限公司春季社會(huì)招聘(10人)筆試參考題庫(kù)附帶答案詳解
- 2025年中石化蕪湖石油分公司招聘8人筆試參考題庫(kù)附帶答案詳解
- 2025中儲(chǔ)糧集團(tuán)黑龍江分公司招聘165人查看職位筆試參考題庫(kù)附帶答案詳解
- 鑄就數(shù)字堅(jiān)盾網(wǎng)絡(luò)安全技術(shù)知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春青島工學(xué)院
- (高清版)JTGT 3650-01-2022 公路橋梁施工監(jiān)控技術(shù)規(guī)程
- 中國(guó)歷史地理智慧樹(shù)知到期末考試答案章節(jié)答案2024年北京大學(xué)
- MOOC 跨文化交際通識(shí)通論-揚(yáng)州大學(xué) 中國(guó)大學(xué)慕課答案
- API520-安全閥計(jì)算PART1(中文版)
- 八年級(jí)期末質(zhì)量分析-課件
- 10000中國(guó)普通人名大全
- 費(fèi)森4008s常見(jiàn)故障排除
- 積極心態(tài)與消極心態(tài)
- 特種設(shè)備檢查記錄
- 《土地寶懺》2019版定稿
評(píng)論
0/150
提交評(píng)論