std::map用法
生活随笔
收集整理的這篇文章主要介紹了
std::map用法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
std::map用法
STL是標(biāo)準(zhǔn)C++系統(tǒng)的一組模板類(lèi),使用STL模板類(lèi)最大的好處就是在各種C++編譯器上都通用。 在STL模板類(lèi)中,用于線性數(shù)據(jù)存儲(chǔ)管理的類(lèi)主要有vector, list, map 等等。本文主要針對(duì)map對(duì)象,結(jié)合自己學(xué)習(xí)該對(duì)象的過(guò)程,講解一下具體用法。本人初學(xué),水平有限,講解差錯(cuò)之處,請(qǐng)大家多多批評(píng)指正。 map對(duì)象所實(shí)現(xiàn)的功能跟MFC得CMap相似,但是根據(jù)一些文章的介紹和論述,MFC CMap在個(gè)方面都與STL map有一定的差距,例如不是C++標(biāo)準(zhǔn),不支持賦值構(gòu)造,對(duì)象化概念不清晰等等。 使用map對(duì)象首先要包括頭文件,包含語(yǔ)句中必須加入如下包含聲明 #include <map> 注意,STL頭文件沒(méi)有擴(kuò)展名.h 包括頭文件后就可以定義和使用map對(duì)象了,map對(duì)象是模板類(lèi),需要關(guān)鍵字和存儲(chǔ)對(duì)象兩個(gè)模板參數(shù),例如: std:map<int, CString> enumMap; 這樣就定義了一個(gè)用int作為關(guān)鍵字檢索CString條目的map對(duì)象,std表示命名空間,map對(duì)象在std名字空間中,為了方便,在這里我仍然使用了CString類(lèi),其實(shí)應(yīng)該使用標(biāo)準(zhǔn)C++的std::string類(lèi),我們對(duì)模板類(lèi)進(jìn)行一下類(lèi)型定義,這樣用的方便,當(dāng)然,不定義也可以,代碼如下: typedef std:map<int, CString> UDT_MAP_INT_CSTRING;UDT_MAP_INT_CSTRING enumMap; 如此map對(duì)象就定義好了,增加,改變map中的條目非常簡(jiǎn)單,因?yàn)閙ap類(lèi)已經(jīng)對(duì)[]操作符進(jìn)行了重載,代碼如下: enumMap[1] = "One";
enumMap[2] = "Two";
.....
enumMap[1] = "One Edit"; 或者insert方法 enumMap.insert(make_pair(1,"One")); 返回map中目前存儲(chǔ)條目的總數(shù)用size()方法: int nSize = enumMap.size(); 查找map中是否包含某個(gè)關(guān)鍵字條目用find方法,傳入的參數(shù)是要查找的key,在我們的例子里,是一個(gè)int數(shù)據(jù),map中的條目數(shù)據(jù)是順序存儲(chǔ)的,被稱(chēng)作為一個(gè)sequence,在這里需要提到的是begin()和end()兩個(gè)成員,分別代表map對(duì)象中第一個(gè)條目和最后一個(gè)條目,這兩個(gè)數(shù)據(jù)的類(lèi)型是iterator,iterator被定義為map中條目的類(lèi)型,查找是否包含某個(gè)條目的代碼如下: int nFindKey = 2;??????????? //要查找的Key
UDT_MAP_INT_CSTRING::iterator it;??? //定義一個(gè)條目變量(實(shí)際是指針)
it = enumMap.find(nFindKey);
if(it == enumMap.end()) {
??? //沒(méi)找到
}
else {
??? //找到
} //find的時(shí)候注意key的數(shù)據(jù)類(lèi)型,最好用CString之類(lèi)的能消除數(shù)據(jù)類(lèi)型差異的key,否則可能會(huì)出現(xiàn)強(qiáng)制轉(zhuǎn)換后仍找不到的情況。 需要說(shuō)明的是iterator, begin(), end()是STL模板類(lèi)的一個(gè)通用概念,操作方法也大同小異 通過(guò)map對(duì)象的方法獲取的iterator數(shù)據(jù)類(lèi)型是一個(gè)std::pair對(duì)象,包括兩個(gè)數(shù)據(jù) iterator.first 和 iterator.second 分別代表關(guān)鍵字和存儲(chǔ)的數(shù)據(jù) 移除某個(gè)條目用erase() 該成員方法的定義如下 iterator erase(iterator it);
iterator erase(iterator first, iterator last);
size_type erase(const Key& key); 分析一下這三個(gè)重載方法定義,大家不用說(shuō)也能看明白一點(diǎn)點(diǎn)了吧,第一個(gè)通過(guò)一個(gè)條目對(duì)象刪除,這個(gè)對(duì)象可以從find之類(lèi)的方法獲得,第二個(gè)定義刪除一個(gè)范圍,需要一個(gè)起始條目和一個(gè)終止條目,第三個(gè)通過(guò)關(guān)鍵字刪除,這個(gè)與我們的想法和習(xí)慣最接近,代碼例子如下: enumMap.erase(1);??????????? //刪掉關(guān)鍵字“1”對(duì)應(yīng)的條目
enumMap.erase(enumMap.begin());??????? //刪掉第一個(gè)條目
enumMap.erase(enumMap.begin(), enumMap.begin() + 1);??? //刪掉起始的兩個(gè)條目 呵呵,增刪改查都說(shuō)完了,相信讀過(guò)本文,map對(duì)象也應(yīng)該會(huì)使用了,這些是我1個(gè)多星期來(lái)鉆研的結(jié)果,拿出來(lái)與大家分享。 最后,還有一個(gè)empty(),不用問(wèn),全刪的時(shí)候就不要一個(gè)一個(gè)erase了,empty()就相當(dāng)于enumMap.erase(enumMap.begin(), enumMap.end()); map的遍歷: #include<map>
#include<string>
#include<iostream>
using namespace std;
int main()
{
??? map<string,int>? m;
??? m["a"]=1;
??? m["b"]=2;
??? m["c"]=3;
??? map<string,int>::iterator it;
??? for(it=m.begin();it!=m.end();++it)
???? ?? cout<<"key: "<<it->first <<" value: "<<it->second<<endl;
??? return?? 0;
}
map<string,int>::iterator it;?? 定義一個(gè)迭代指針it。? it->first 為索引鍵值,it->second 為值。
? 在對(duì)象中應(yīng)用時(shí),最好在析構(gòu)函數(shù)中要調(diào)用它的clear方法, 例如class a{ map<int,int> m; ~a(){ m.clear(); } }
總結(jié)
以上是生活随笔為你收集整理的std::map用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 佐菲你出息了!《新·奥特曼》特别版MV首
- 下一篇: 骁龙8满血旗舰 小米12出现神价格:26