




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C++深入分析STL中map容器的使用目錄1、map容器2、map容器原理3、map容器函數(shù)接口4、使用示例
1、map容器
map是C++STL的一個(gè)關(guān)聯(lián)容器,它提供一對一的數(shù)據(jù)處理能力。其中,各個(gè)鍵值對的鍵和值可以是任意數(shù)據(jù)類型,包括C++基本數(shù)據(jù)類型(int、double等)、使用結(jié)構(gòu)體或類自定義的類型。
第一個(gè)可以稱為關(guān)鍵字(key);
第二個(gè)可能稱為該關(guān)鍵字的值(value);
該容器存儲的都是pairconstK,T類型(其中K和T分別表示鍵和值的數(shù)據(jù)類型)的鍵值對元素。
使用map容器存儲的各個(gè)鍵值對,鍵的值既不能重復(fù)也不能被修改。換句話說,map容器中存儲的各個(gè)鍵值對不僅鍵的值獨(dú)一無二,鍵的類型也會用const修飾,這意味著只要鍵值對被存儲到map容器中,其鍵的值將不能再做任何修改。
2、map容器原理
map容器的實(shí)現(xiàn)是自建了一顆紅黑樹,這顆樹具有對數(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()返回特殊條目的迭代器對
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對象,其鍵和值的類型分別為key和value。
mapkey,valuem(m2);//創(chuàng)建m2的副本m,m與m2必須有相同的鍵類型和值類型。
mapkey,valuem(b,e);//創(chuàng)建map類型的對象m,存儲迭代器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//如果刪除了會返回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類型對象,包含指向鍵為e.first的元素的map迭代器,以及一個(gè)bool類型的對象,表示是否插入了該元素。
m.insert(beg,end);
beg和end是標(biāo)記元素范圍的迭代器,對于該范圍內(nèi)的所有元素,如果它的鍵在m中不存在,則將該鍵及其關(guān)聯(lián)的值插入到m。返回void類型。
m.insert(iter,e);
e是value_type類型的值,如果e.first不在m中,則創(chuàng)建新元素,并以迭代器iter為起點(diǎn)搜索新元素存儲的位置,返回一個(gè)迭代器,指向m中具有給定鍵的元素。在添加新的map元素時(shí),使用insert成員可避免使用下標(biāo)操作符帶來的副作用:不必要的初始化。
//在往map里面插入了數(shù)據(jù),我們怎么知道當(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));
我們通過pair的第二個(gè)變量來知道是否插入成功,它的第一個(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ù)來判定關(guān)鍵字是否出現(xiàn),其缺點(diǎn)是無法定位數(shù)據(jù)出現(xiàn)位置,由于map的特性,一對一的映射關(guān)系,就決定了count函數(shù)的返回值只有兩個(gè),要么是0,要么是1,出現(xiàn)的情況,當(dāng)然是返回1了
第二種:用find函數(shù)來定位數(shù)據(jù)出現(xiàn)位置,它返回的一個(gè)迭代器,當(dāng)數(shù)據(jù)出現(xiàn)時(shí),它返回?cái)?shù)據(jù)所在位置的迭代器,如果map中沒有要查找的數(shù)據(jù),它返回的迭代器等于end函數(shù)返回的迭代器。
查找map中是否包含某個(gè)關(guān)鍵字條目用find()方法,傳入的參數(shù)是要查找的key,在這里需要提到的是begin()和end()兩個(gè)成員,
分別代表map對象中第一個(gè)條目和最后一個(gè)條目,這兩個(gè)數(shù)據(jù)的類型是iterator.
通過map對象的方法獲取的iterator數(shù)據(jù)類型是一個(gè)std::pair對象,包括兩個(gè)數(shù)據(jù)iterator-first和iterator-second分別代表關(guān)鍵字和存儲的數(shù)據(jù)。
mapint,string::iteratorl_it;;
l_it=maplive.find(112);
if(l_it==maplive.end())
cout"wedonotfind112"endl;
elsecout"wofind112"endl;
第三種:這個(gè)方法用來判定數(shù)據(jù)是否出現(xiàn),是顯得笨了點(diǎn),
lower_bound函數(shù)用法,這個(gè)函數(shù)用來返回要查找關(guān)鍵字的下界(是一個(gè)迭代器)
upper_bound函數(shù)用法,這個(gè)函數(shù)用來返回要查找關(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è)迭代器相等的話,則說明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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 試工合同協(xié)議書
- 物流乙方合同終止協(xié)議書
- 2025年文化與科技融合創(chuàng)新模式下的數(shù)字文化內(nèi)容審核機(jī)制研究報(bào)告
- 居住房屋裝修合同協(xié)議書
- 托管合同到期協(xié)議書
- 合同協(xié)議書表格
- 2025年工業(yè)互聯(lián)網(wǎng)平臺光通信技術(shù)升級路徑下的產(chǎn)業(yè)政策與產(chǎn)業(yè)競爭格局分析報(bào)告
- 商鋪合同協(xié)議書雙合同
- 購車合同終止協(xié)議書
- 合同還款協(xié)議書
- 鑄就數(shù)字堅(jiān)盾網(wǎng)絡(luò)安全技術(shù)知到課后答案智慧樹章節(jié)測試答案2025年春青島工學(xué)院
- (高清版)JTGT 3650-01-2022 公路橋梁施工監(jiān)控技術(shù)規(guī)程
- 中國歷史地理智慧樹知到期末考試答案章節(jié)答案2024年北京大學(xué)
- MOOC 跨文化交際通識通論-揚(yáng)州大學(xué) 中國大學(xué)慕課答案
- API520-安全閥計(jì)算PART1(中文版)
- 常見典型心電圖診斷規(guī)培-課件
- 國內(nèi)旅客臨時(shí)住宿登記表格式
- 八年級期末質(zhì)量分析-課件
- 10000中國普通人名大全
- 費(fèi)森4008s常見故障排除
- 積極心態(tài)與消極心態(tài)
評論
0/150
提交評論