C++中的關(guān)聯(lián)式容器map用法

關(guān)聯(lián)式容器是什么

?關(guān)聯(lián)式容器在存儲(chǔ)元素值的同時(shí)驶臊,還會(huì)為各元素額外再配備一個(gè)值(又稱為“鍵”,其本質(zhì)也是一個(gè) C++ 基礎(chǔ)數(shù)據(jù)類型或自定義類型的元素)对湃,它的功能是在使用關(guān)聯(lián)式容器的過程中鸠珠,如果已知目標(biāo)元素的鍵的值饺蔑,則直接通過該鍵就可以找到目標(biāo)元素锌介,而無需再通過遍歷整個(gè)容器的方式。
?使用關(guān)聯(lián)式容器存儲(chǔ)的元素猾警,都是一個(gè)一個(gè)的“鍵值對”( <key,value> )孔祸,這是和序列式容器最大的不同。除此之外发皿,序列式容器中存儲(chǔ)的元素默認(rèn)都是未經(jīng)過排序的崔慧,而使用關(guān)聯(lián)式容器存儲(chǔ)的元素,默認(rèn)會(huì)根據(jù)各元素的鍵值的大小做升序排序穴墅。

關(guān)聯(lián)式容器名稱 特點(diǎn)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? map 定義在 <map> 頭文件中惶室,使用該容器存儲(chǔ)的數(shù)據(jù),其各個(gè)元素的鍵必須是唯一的(即不能重復(fù))玄货,該容器會(huì)根據(jù)各元素鍵的大小皇钞,默認(rèn)進(jìn)行升序排序(調(diào)用 std::less<T>)。可以快速查找松捉、讀取或者刪除所存儲(chǔ)的元素夹界,同時(shí)該類型容器插入元素的效率也比序列式容器高。
set ?? 定義在 <set> 頭文件中隘世,使用該容器存儲(chǔ)的數(shù)據(jù)可柿,各個(gè)元素鍵和值完全相同鸠踪,且各個(gè)元素的值不能重復(fù)(保證了各元素鍵的唯一性)。該容器會(huì)自動(dòng)根據(jù)各個(gè)元素的鍵(其實(shí)也就是元素值)的大小進(jìn)行升序排序(調(diào)用 std::less<T>)复斥。
multimap 定義在 <map> 頭文件中营密,和 map 容器唯一的不同在于,multimap 容器中存儲(chǔ)元素的鍵可以重復(fù)目锭。
multiset 定義在 <set> 頭文件中卵贱,和 set 容器唯一的不同在于,multiset 容器中存儲(chǔ)元素的值可以重復(fù)(一旦值重復(fù)侣集,則意味著鍵也是重復(fù)的)键俱。

pair類模板

pair 類模板定義在<utility>頭文件。
考慮到“鍵值對”并不是普通類型數(shù)據(jù)世分,C++STL 標(biāo)準(zhǔn)庫提供了 pair 類模板编振,其專門用來將 2 個(gè)普通元素 first 和 second(可以是 C++ 基本數(shù)據(jù)類型、結(jié)構(gòu)體臭埋、類自定的類型)創(chuàng)建成一個(gè)新元素<first, second>踪央。

map

map 容器存儲(chǔ)的都是 pair 對象,也就是用 pair 類模板創(chuàng)建的鍵值對瓢阴。各個(gè)鍵值對的鍵和值可以是任意數(shù)據(jù)類型畅蹂,包括 C++ 基本數(shù)據(jù)類型(int、double 等)荣恐、使用結(jié)構(gòu)體或類自定義的類型液斜。(一般情況下,使用string類型做鍵值對的類型)
需要注意的是叠穆,使用 map 容器存儲(chǔ)的各個(gè)鍵值對少漆,鍵的值既不能重復(fù)也不能被修改。換句話說硼被,map 容器中存儲(chǔ)的各個(gè)鍵值對不僅鍵的值獨(dú)一無二示损,鍵的類型也會(huì)用 const 修飾,這意味著只要鍵值對被存儲(chǔ)到 map 容器中嚷硫,其鍵的值將不能再做任何修改检访。

使用

map 容器定義在<map> 頭文件中,并位于 std 命名空間中仔掸。

#include <map>  
using namespace std;  

創(chuàng)建方法

1.調(diào)用 map 容器類的默認(rèn)構(gòu)造函數(shù)脆贵,可以創(chuàng)建出一個(gè)空的 map 容器。

std::map<std::string, int>Map1;  

2.創(chuàng)建時(shí)也可以初始化 嘉汰。

std::map<std::string, int>Map1{ {"C語言",10},{"STL",20} };

3.也可以利用先前已創(chuàng)建好的 map 容器丹禀,再創(chuàng)建一個(gè)新的 map 容器。

std::map<std::string, int>newMap(Map1);

~這里了解一下吧,當(dāng)有臨時(shí)的 map 對象作為參數(shù)双泪,傳遞給要初始化的 map 容器時(shí)持搜,此時(shí)就會(huì)調(diào)用移動(dòng)構(gòu)造函數(shù)。~

#創(chuàng)建一個(gè)會(huì)返回臨時(shí) map 對象的函數(shù)
std::map<std::string,int> disMap() {
    std::map<std::string, int>tempMap{ {"C",10},{"STL",20} };
    return tempMap;
}
//調(diào)用 map 類模板的移動(dòng)構(gòu)造函數(shù)創(chuàng)建 newMap 容器
std::map<std::string, int>newMap(disMap());

map容器包含的成員方法

成員方法 功能
begin() 返回指向容器中第一個(gè)(注意焙矛,是已排好序的第一個(gè))鍵值對的雙向迭代器葫盼。如果 map 容器用 const 限定贴妻,則該方法返回的是 const 類型的雙向迭代器
end() ?? 返回指向容器最后一個(gè)元素(注意孵坚,是已排好序的最后一個(gè))所在位置后一個(gè)位置的雙向迭代器,通常和 begin() 結(jié)合使用贼陶。如果 map 容器用 const 限定蟆盹,則該方法返回的是 const 類型的雙向迭代器孩灯。
rbegin() 返回指向最后一個(gè)(注意,是已排好序的最后一個(gè))元素的反向雙向迭代器逾滥。如果 map 容器用 const 限定峰档,則該方法返回的是 const 類型的反向雙向迭代器。
rend() ?? 返回指向第一個(gè)(注意寨昙,是已排好序的第一個(gè))元素所在位置前一個(gè)位置的反向雙向迭代器讥巡。如果 map 容器用 const 限定,則該方法返回的是 const 類型的反向雙向迭代器舔哪。
cbegin() 和 begin() 功能相同欢顷,只不過在其基礎(chǔ)上,增加了 const 屬性捉蚤,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對抬驴。
cend() ?? 和 end() 功能相同,只不過在其基礎(chǔ)上外里,增加了 const 屬性怎爵,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對特石。
crbegin() 和 rbegin() 功能相同盅蝗,只不過在其基礎(chǔ)上,增加了 const 屬性姆蘸,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對墩莫。
crend() 和 rend() 功能相同,只不過在其基礎(chǔ)上逞敷,增加了 const 屬性狂秦,不能用于修改容器內(nèi)存儲(chǔ)的鍵值對。
find(key) 在 map 容器中查找鍵為 key 的鍵值對推捐,如果成功找到裂问,則返回指向該鍵值對的雙向迭代器;反之,則返回和 end() 方法一樣的迭代器堪簿。另外痊乾,如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器椭更。
lower_bound(key) 返回一個(gè)指向當(dāng)前 map 容器中第一個(gè)大于或等于 key 的鍵值對的雙向迭代器哪审。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器虑瀑。
upper_bound(key) 返回一個(gè)指向當(dāng)前 map 容器中第一個(gè)大于 key 的鍵值對的迭代器湿滓。如果 map 容器用 const 限定,則該方法返回的是 const 類型的雙向迭代器舌狗。
equal_range(key) 該方法返回一個(gè) pair 對象(包含 2 個(gè)雙向迭代器)叽奥,其中 pair.first 和 lower_bound() 方法的返回值等價(jià),pair.second 和 upper_bound() 方法的返回值等價(jià)痛侍。也就是說而线,該方法將返回一個(gè)范圍,該范圍中包含的鍵為 key 的鍵值對(map 容器鍵值對唯一恋日,因此該范圍最多包含一個(gè)鍵值對)膀篮。
empty() 若容器為空,則返回 true岂膳;否則 false誓竿。
size() ?? 返回當(dāng)前 map 容器中存有鍵值對的個(gè)數(shù)。
max_size() 返回 map 容器所能容納鍵值對的最大個(gè)數(shù)谈截,不同的操作系統(tǒng)筷屡,其返回值亦不相同。
operator[] map容器重載了 [] 運(yùn)算符簸喂,只要知道 map 容器中某個(gè)鍵值對的鍵的值毙死,就可以向獲取數(shù)組中元素那樣,通過鍵直接獲取對應(yīng)的值喻鳄。
at(key) 找到 map 容器中 key 鍵對應(yīng)的值扼倘,如果找不到,該函數(shù)會(huì)引發(fā) out_of_range 異常除呵。
insert() 向 map 容器中插入鍵值對再菊。
erase() 刪除 map 容器指定位置、指定鍵(key)值或者指定區(qū)域內(nèi)的鍵值對颜曾。后續(xù)章節(jié)還會(huì)對該方法做重點(diǎn)講解纠拔。
swap() 交換 2 個(gè) map 容器中存儲(chǔ)的鍵值對,這意味著泛豪,操作的 2 個(gè)鍵值對的類型必須相同稠诲。
clear() 清空 map 容器中所有的鍵值對侦鹏,即使 map 容器的 size() 為 0。
emplace() 在當(dāng)前 map 容器中的指定位置處構(gòu)造新鍵值對臀叙。其效果和插入鍵值對一樣种柑,但效率更高。
emplace_hint() 在本質(zhì)上和 emplace() 在 map 容器中構(gòu)造新鍵值對的方式是一樣的匹耕,不同之處在于聚请,使用者必須為該方法提供一個(gè)指示鍵值對生成位置的迭代器,并作為該方法的第一個(gè)參數(shù)稳其。
count(key) 在當(dāng)前 map 容器中驶赏,查找鍵為 key 的鍵值對的個(gè)數(shù)并返回。注意既鞠,由于 map 容器中各鍵值對的鍵的值是唯一的煤傍,因此該函數(shù)的返回值最大為 1。

以begin()end()寫一個(gè)程序嘱蛋。

#include <iostream>  
#include <map> // pair  
#include <string> // string  
u[sin](as)g namespace std;  

int main() 
{  
  //創(chuàng)建并初始化 map 容器  
  std::map<std::string, std::string>myMap{{"STL","a"},{"C語","b"} };

  //調(diào)用 begin()/end() 組合蚯姆,遍歷 map 容器  
  for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {  
    cout << iter->first << " " << iter->second << endl;  
     }  
  return 0;  
}  

文章參考:《C語言中文網(wǎng)》http://c.biancheng.net/view/7169.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洒敏,隨后出現(xiàn)的幾起案子龄恋,更是在濱河造成了極大的恐慌,老刑警劉巖凶伙,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郭毕,死亡現(xiàn)場離奇詭異,居然都是意外死亡函荣,警方通過查閱死者的電腦和手機(jī)显押,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傻挂,“玉大人乘碑,你說我怎么就攤上這事〗鹁埽” “怎么了兽肤?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長殖蚕。 經(jīng)常有香客問我轿衔,道長,這世上最難降的妖魔是什么睦疫? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鞭呕,結(jié)果婚禮上蛤育,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好瓦糕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布底洗。 她就那樣靜靜地躺著,像睡著了一般咕娄。 火紅的嫁衣襯著肌膚如雪亥揖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天圣勒,我揣著相機(jī)與錄音费变,去河邊找鬼。 笑死圣贸,一個(gè)胖子當(dāng)著我的面吹牛挚歧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吁峻,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼滑负,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了用含?” 一聲冷哼從身側(cè)響起矮慕,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啄骇,沒想到半個(gè)月后凡傅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肠缔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年夏跷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片明未。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡槽华,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趟妥,到底是詐尸還是另有隱情猫态,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布披摄,位于F島的核電站亲雪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疚膊。R本人自食惡果不足惜义辕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寓盗。 院中可真熱鬧灌砖,春花似錦璧函、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撩幽,卻和暖如春库继,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窜醉。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工宪萄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酱虎。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓雨膨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親读串。 傳聞我的和親對象是個(gè)殘疾皇子聊记,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348