C 修煉之路 map

2021-07-15 08:43:46 字數 2528 閱讀 7591

關聯容器map是鍵 - 值對的集合,鍵可以作為map的下標對值進去操作。這一操作有些像陣列,所以map也可以看成關聯陣列。

使用map需包含標頭檔案

#include

map的定義為

mapmap_val;

其中k為鍵索引的型別,v為關聯值得型別。

map的建構函式有三種形式

mapm;					//空map物件

mapm(m0); //與m0型別相同的map物件m,m做為m0的副本

mapm(beg, end); //m存放迭代器beg與end之間所有元素的副本

假設定義map型別為

mapperson;			//string為乙個人的身份證號,int為乙個人的年齡

對於person物件,string型別的身份證號是其索引,int型別為其年齡值。

需要注意的是map的鍵k是不能修改的,只有值v是可修改的,就像person,其身份證號是固定的,而年齡會不斷改變一樣。

map類定義三種常用的型別

map::key_type					//索引鍵的型別

map::value_type //pair型別,first為其鍵型別,second為其值型別

其中需要特別留意的是pair型別,pair型別的基本形式為

pairp;
pair有倆個資料成員first、second,他們分別對應t1、t2

假設我們定義乙個pair型別物件

pairpair_str("aaaa","bbb");
則pair_str.first即為「aaaa」,pair_str.second即為「bbbb」。

對迭代器進行解引用時,獲得乙個指向容器中乙個value_type型別的值,因此map的迭代器,其迭代器進行解引用時產生乙個pair型別的物件。

map::iterator map_item = person.begin();

cout << map_item->first.c_str() << endl;

cout << map_item->second << endl;

1.使用下標

map的下標操作與陣列的下標操作完全不同,map的下標操作不僅有查詢功能,而且可以實現元素的插入。

person["per1"] = 10;
執行上面的語句時,如果person物件內沒有鍵值為"per1"的元素,則會插入一條鍵值為"per1"的資料,其資料值為10;如果person物件內有該鍵值,則只執行修改操作。下標操作符的這一特性在一些問題應用得當,可以達到很好的效果。

2.insert

map的insert操作與其他容器的插入類似。map的insert有三種形式

person.insert(e);		//插入乙個map::value_type型別的值e

person(beg, end); //beg和end是標記要複製元素範圍的迭代器

person(item, e); //插入乙個元素e,以迭代器item為起點搜尋新元素位置,返回新元素的迭代器

這裡有一點需要特別注意的是,對於第乙個插入方法,

如果插入的資料對鍵值已經存在,則插入失敗,否則插入成功,該方法返回值是乙個pair型別的值,pair::iterator,bool>,該型別的first是person型別map,second是插入結果,true代表插入成功,false代表插入失敗。通過檢測返回值,我們可以知道插入狀態。

map的刪除元素方法有3中形式

person.erase(k);					//刪除鍵值為k的元素,返回刪除個數

person.erase(p); //p為要刪除的元素的迭代器,返回void

person.erase(beg, end); //迭代器beg和end標識要刪除元素的範圍

map的下標操作符是一種方法,但是下標操作會對查詢的鍵值不存在的元素執行插入操作。在很多時候我們並不希望這樣的插入,所以我們需要使用其他方法。

map提供count和find倆種方法,

person.count(k);				//返回person中鍵值k出現的次數

person.find(k); //返回person中鍵值為k的元素的迭代器,不存在則返回末端迭代器

通常我們使用count檢視鍵值是否存在,使用find對相應鍵值的元素進行修改。

由於map提供begin和end操作,所以使用迭代器遍歷是很方便的。

map::iterator it = person.begin();

while (it != person.end())

有任何不對之處,望指出以改正。。。

Python修煉之路 異常

在程式出現bug時一般不會將錯誤資訊直接顯示給使用者,而是可以自定義顯示內容或處理。常見異常 attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x ioerror 輸入 輸出異常 基本上是無法開啟檔案 importerror 無法引入模組或包 基本上是路徑問...

演算法修煉之路遠兮

這篇部落格其實前前後後已經想了好久了,這次毅然借求職這個機會,準備把自己近幾年來寫的演算法都整理一遍。演算法,作為計算機中一門基礎又有一定難度的一科,是很多從事計算機行業要打好基礎的部分。就像練武功一樣,這個就是基本功,雖然說可能很多人從事的工作,其中用到的演算法很少,但不應該就此就否認演算法的作用...

軟體測試新手的修煉之路

1 興趣是最好的老師 對於軟體測試工作,通常是比較枯燥的,如果沒有興趣很難做到持久。我最近參與了乙個軟體測試專案,在測試團隊中,有三位是在校學生,他們以兼職的身份到公司上班,他們都是軟體相關專業的本科生和研究生,基礎都不錯。但是,只有其中一位表現最突出,因為他很珍惜這份社會實踐的工作機會,做事認真,...