1. 程式人生 > >map常用用法詳解

map常用用法詳解

map翻譯為對映,也是常見的STL容器

在定義陣列時(如int array[100]),其實是定義了一個從int型到int型的對映

比如array[0]=25、array[4]=36就分別是將0對映到25、將4對映到36

一個double型陣列則是將int型對映到double型,

如db[0]=3.14,double[1]=0.01

但是,無論是什麼型別

它總是將int型對映到其他型別

這似乎表現出一個弊端:

當需要以其他型別為關鍵字來做對映時,

會顯得不太方便

例如有一本字典,

上面提供了很多的字串和對應的頁碼,如果要用陣列來表示“字串——>頁碼”這樣的對應關係

就會感覺不太好操作

這時,就可以用到map,因為map可以將任何基本型別

(包括STL容器)對映到任何基本型別(包括STL容器)

也就可以建立string型到int型的對映

【另一種情況】

需要判斷給定的一些數字在某個檔案中是否出現過

按照正常的思路,可以開一個bool 型hashTable[max_size]

通過判斷hashTable[x]為true還是false來確定x是否在檔案中出現

但是這會碰到一種問題:

如果這些數字很大(例如有幾千位)那麼這個數字就會開不了

而這時map就可以派上用場

因為可以把這些數字當成一些字串

然後建立至int的對映(或者直接建立int至int的對映)

【標頭檔案】

#include<map>

using namespace std;

1、map的定義

map<typename1,typename2>mp;

與其他STL容器在定義上不一樣,因為map需要確定對映前型別(鍵key)和對映後型別(值value)

所以需要在<>內填寫兩個型別

其中一個是鍵的型別

第二個是值得型別

如果是int型對映到int型,就相當於是普通的int型陣列

但是如果是字串到整型的對映,必須是string而不是char陣列

map<string,int>mp

這時因為char陣列作為陣列是不能被作為鍵值的。所以字串作對映,只能用string

而map的劍河之也可以是STL容器

map<set<int>,string>mp

2、map容器內元素的訪問

①通過下標訪問

【注意】map的鍵是唯一的

mp['c']=20;

②通過迭代器訪問

定義方式與其他STL容器迭代器相同

【不同】

map迭代器的使用方式和其他STL容器的迭代器不同

因為map的每一對對映都有兩個typename

這決定了必須通過一個it來同時訪問鍵和值

事實上,map可以使用it->first來訪問鍵

使用it->second來訪問值

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
using namespace std;
int main()
{
   map<char,int>mp;
   mp['m']=20;
   mp['r']=30;
   mp['a']=40;
   for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
   {
       printf("%c %d\n",it->first,it->second);
   }
   return 0;
}

map會以鍵的大小從小到大的順序自動排序

即按照a<m<r的順序排列這三對對映

這是因為map內部是使用紅黑樹(set也是)

在建立對映的過程中會自動實現從小到大的排序功能

3、map常用函式

①find()

find(key)返回鍵是key的對映的迭代器

②erase()

(1)刪除單個元素

a.mp.erase(it),it為需要刪除的元素的迭代器

b.mp.erase(key),key為欲刪除的對映的鍵

e.g.mp.erase('c');

(2)刪除一個區間內的所有元素

還是左閉右開

(3)size()

用來獲得map中對映的次數

(4)clear()

清空

4、常見用途

①需要建立字元(或字串)與整數之間影射的題目,使用map可以減少程式碼量

②判斷大整數或者其他型別資料是否存在的題目,可以把map當bool陣列使用

③字串和字串的對映也有可能會遇到

延伸:

map的鍵和值是唯一的,而如果一個鍵需要對應多個值

就只能用multimap

知識點來自於《演算法筆記》