std:map使用筆記

本人是多年的C碼農(nóng)立美,最近才開(kāi)始玩C++匿又,所以難免會(huì)遇到C++里很平常普通的東西,在C程序員眼里已經(jīng)灰常神奇了建蹄。
舉個(gè)例子碌更,最普通的鏈表,在C里面要構(gòu)建一個(gè)鏈表躲撰,要解決的幾個(gè)問(wèn)題:

  1. 每個(gè)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)
  2. 節(jié)點(diǎn)的插入针贬、刪除問(wèn)題,以及由此產(chǎn)生的內(nèi)存問(wèn)題
  3. 鏈表的表頭拢蛋,表尾問(wèn)題
  4. 特定節(jié)點(diǎn)的查找,匹配
  5. 鏈表的遍歷蔫巩,排序問(wèn)題
  6. 等等

上面列舉的是鏈表操作的幾個(gè)基本問(wèn)題谆棱,但是在C里面要自己構(gòu)建一個(gè)好用且不出錯(cuò)的鏈表快压,并且把以上基本操作都實(shí)現(xiàn),估計(jì)也得花一番好功夫垃瞧。
C++就不一樣了蔫劣,C++提供一個(gè)STL(標(biāo)準(zhǔn)模板類)庫(kù),這個(gè)里面有個(gè)std::map模板類个从,是一個(gè)關(guān)聯(lián)式容易脉幢,簡(jiǎn)單理解為,鏈表里的每個(gè)節(jié)點(diǎn)都是一個(gè)<key, value>對(duì)嗦锐。
現(xiàn)在就來(lái)看下它是如何減輕碼農(nóng)痛苦的嫌松。


一.建一張表

看到這個(gè)問(wèn)題,C碼農(nóng)是不是馬上就要想奕污,哎呀萎羔,那我要:

  1. 先設(shè)計(jì)一個(gè)數(shù)據(jù)節(jié)點(diǎn),并設(shè)計(jì)成鏈表節(jié)點(diǎn)碳默;
  2. 然后再不斷的malloc新節(jié)點(diǎn)贾陷;
  3. 再依次把這些節(jié)點(diǎn)串接起來(lái),形成一張表嘱根。

把上面這幾點(diǎn)用code實(shí)現(xiàn)并調(diào)通髓废,那就是個(gè)合格的C程序員。
但是我們來(lái)看看用STL提供的模板類有多么方便该抒。
直接上代碼:

sample 1

#include<map>
#include<string>
#include<iostream>
using namespace std;

int main()
{
    // 聲明一張表
    map<string,int>  myMap;     
    
    // 依次給這張表添加元素
    myMap["a"]=1;                       
    myMap["b"]=2;
    myMap["c"]=3;
    
    // 遍歷剛剛建的表
    map<string,int>::iterator it;
    for(it=myMap.begin(); it!=myMap.end(); ++it)
        cout<<"key: "<<it->first <<" value: "<<it->second<<endl;
    
    return   0;
}

這段code輸出為:

key: a value: 1
key: b value: 2
key: c value: 3

哇瓦哎,是不是有點(diǎn)神奇了,建一張表柔逼,以及遍歷這張表蒋譬,這么簡(jiǎn)單!
怎么看起來(lái)像C的數(shù)組愉适?
其實(shí)不是犯助,其實(shí)是這個(gè)模板類重載了操作符[ ], 讓你看起來(lái)覺(jué)得像數(shù)組而已维咸;
這個(gè)有點(diǎn)點(diǎn)誤導(dǎo)剂买,我覺(jué)得比較純正的還是insert方法,再看下一段code:

sample 2

#include<map>
#include<string>
#include<iostream>
using namespace std;

int main()
{
    map<string,int>  myMap;             // 聲明一張表

    // 依次給這張表添加元素
    myMap.insert(pair<string, int>("a", 1));    
    myMap.insert(pair<string, int>("b", 2));
    myMap.insert(pair<string, int>("c", 3));

    // 遍歷剛剛建的表
    map<string,int>::iterator it;
    for(it=myMap.begin(); it!=myMap.end(); ++it)
        cout<<"key: "<<it->first <<" value: "<<it->second<<endl;
    return   0;
}

這次看起來(lái)有點(diǎn)正兒八經(jīng)的鏈表插入的感覺(jué)了吧:)
用上C++提供的標(biāo)準(zhǔn)模板庫(kù)癌蓖,有不有點(diǎn)從石器時(shí)代跨入青銅時(shí)代的感覺(jué)~~~


二. 刪除節(jié)點(diǎn)

既然有增加節(jié)點(diǎn)瞬哼,那么對(duì)應(yīng)地,就有刪除節(jié)點(diǎn)租副。
我們先回顧一下C怎么考慮這個(gè)問(wèn)題的:

  1. 在鏈表中找到特定的節(jié)點(diǎn)坐慰。
  2. 把這個(gè)節(jié)點(diǎn)從鏈表中斷開(kāi),把這個(gè)節(jié)點(diǎn)的相鄰節(jié)點(diǎn)鏈上用僧。
  3. free掉這個(gè)節(jié)點(diǎn)结胀。

裹筋吧赞咙,我們看看std:map是怎么讓人happy的。
看代碼:

sample 3

#include<map>
#include<string>
#include<iostream>
using namespace std;

int main()
{
    map<string,int>  myMap;             // 聲明一張表

    // 依次給這張表添加元素
    myMap.insert(pair<string, int>("a", 1));    
    myMap.insert(pair<string, int>("b", 2));
    myMap.insert(pair<string, int>("c", 3));

    // 遍歷剛剛建的表
    map<string,int>::iterator it;
    for(it=myMap.begin(); it!=myMap.end(); ++it)
        cout<<"key: "<<it->first <<" value: "<<it->second<<endl;

    cout << endl;

    // 刪掉一個(gè)節(jié)點(diǎn)
    myMap.erase("b");
    map<string,int>::iterator iter;
    for(iter=myMap.begin(); iter!=myMap.end(); ++iter)
        cout<<"key: "<<iter->first <<" value: "<<iter->second<<endl;
    return   0;
}

刪除特定節(jié)點(diǎn)糟港?free廢節(jié)點(diǎn)攀操?自動(dòng)就幫你做了!


三. 清空map

清空操作為什么單獨(dú)拿出來(lái)說(shuō)一下秸抚,是因?yàn)槲业谝淮问褂靡卜噶隋e(cuò)誤速和,因?yàn)樽钊菀紫氲降姆椒ň褪牵罕闅v這個(gè)表,one by one地刪除每一個(gè)節(jié)點(diǎn)剥汤。
請(qǐng)看錯(cuò)誤代碼:

map<string,int>::iterator iter;
for(iter=myMap.begin(); iter!=myMap.end(); ++iter) {
    myMap.erase(iter);
}

這其實(shí)是錯(cuò)誤的寫(xiě)法颠放,因?yàn)閑rase會(huì)釋放掉iter,然后執(zhí)行++iter秀姐,程序就回跑飛慈迈。
所以這里附上一個(gè)推薦的寫(xiě)法:

map<string,int>::iterator iter;
for(iter=myMap.begin(); iter!=myMap.end(); ) {
    // erase() 返回的是下一個(gè)元素的迭代器 
    iter = myMap.erase(iter);
}

或者再簡(jiǎn)單一點(diǎn):

myMap.clear();

世界清凈了~ 讓我歇會(huì)兒,喝口茶省有。


四. 幾個(gè)經(jīng)常用的方法

Item Description
begin() 返回指向map頭部的迭代器
clear() 刪除所有元素
empty() 判斷map是否為空
end() 返回指向map末尾的迭代器
erase() 刪除一個(gè)元素
find() 查找一個(gè)元素
insert() 插入元素
size() 返回map中元素的個(gè)數(shù)

還有其他的就不一一列舉了痒留,還有就是要注意這些方法的重載版本,用的時(shí)候可以特別研究一下蠢沿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伸头,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舷蟀,更是在濱河造成了極大的恐慌恤磷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野宜,死亡現(xiàn)場(chǎng)離奇詭異扫步,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)匈子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門河胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虎敦,你說(shuō)我怎么就攤上這事游岳。” “怎么了其徙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵胚迫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我唾那,道長(zhǎng)访锻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮朗若,結(jié)果婚禮上恼五,老公的妹妹穿的比我還像新娘昌罩。我一直安慰自己哭懈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布茎用。 她就那樣靜靜地躺著遣总,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轨功。 梳的紋絲不亂的頭發(fā)上旭斥,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音古涧,去河邊找鬼垂券。 笑死,一個(gè)胖子當(dāng)著我的面吹牛羡滑,可吹牛的內(nèi)容都是我干的菇爪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柒昏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凳宙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起职祷,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氏涩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后有梆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體是尖,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年泥耀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饺汹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爆袍,死狀恐怖首繁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陨囊,我是刑警寧澤弦疮,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蜘醋,受9級(jí)特大地震影響胁塞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一啸罢、第九天 我趴在偏房一處隱蔽的房頂上張望编检。 院中可真熱鬧,春花似錦扰才、人聲如沸允懂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蕾总。三九已至,卻和暖如春琅捏,著一層夾襖步出監(jiān)牢的瞬間生百,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工柄延, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚀浆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓搜吧,卻偏偏與公主長(zhǎng)得像市俊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赎败,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容