map容器
介紹:
提供一個鍵--值對容器,表示了一個一對一的關係(可以想象數組下標與該位置元素的對應關係),map(映射)與multimap(多重映射)差別在於multiple允許一個鍵對應多個值。
頭文件:
#include <map>
定義:
map<string, int> mymap;
一些基本操作:
插入內容:
(1) mymap ["a"] = 1;
(2) mymap.insert(map<string, int>::value_type("b",2));
(3) mymap.insert(pair<string,int>("c",3));
可以由string鍵來查找,賦值
鍵本身是不能被修改的,不會重複的
刪除數據:
mymap.erase("c");
其它方法 :
mymap.size() 返回元素數目
mymap.empty() 判斷是否爲空
mymap.clear() 清空所有元素
迭代器見示例:
示例實現了對輸入空格分隔的字符串(可以理解爲單詞)的計數;
#include
#include
using namespace std;
int main()
{
mapmymap;
map::iterator it;
string temp;
while(cin>>temp&&temp!="EOF")//
mymap[temp]++;
for(it=mymap.begin();it!=mymap.end();it++)
cout<first<<" "<second<
爲了實現快速查找,map內部本身就是按序存儲的(比如紅黑樹)。在我們插入<key, value>鍵值對時,就會按照key的大小順序進行存儲。這也是作爲key的類型必須能夠進行<運算比較的原因。
別人的講排序的鏈接
判斷map是否包含一個鍵,是用map的find方法,判斷find的返回結果是否是map的end
if(m.find(1)==m.end())
cout<<"no key find"<<endl;
else
cout<<"key find";
還有人會用map[key]==0的方法,這有一些問題:
看示例:
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n,key,val;
map<int, int > m;
if(m.find(1)==m.end())
cout<<"no key find"<<endl;
else
cout<<"key find";
if(!m[1])
{
if(m.find(1)!=m.end())
cout<<"key find"<<endl;
}
if(m.find(1)!=m.end())
cout<<"key find"<<endl;
}
輸出:
爲啥呢?開始找不到,之後又找到了?關鍵在於map下標的使用
在map查找這個鍵值的項,map如果不包含某個鍵值,會返回map的end,然後它發現此鍵值沒有找到的話,會自動在末尾插入一個以你輸入的鍵值([]中的內容)和value的默認值構成的對,然後返回這個插入項的值(first,second,),而int的默認構造函數int(),就是0。
但有時,這樣的使用是有利的,只要弄清就好;
一個合併數據表記錄,包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算;
此時,採用如下方法添加表項是十分方便的,該方式細節並不是無目標創建,有對應鍵,相加;最終實現是對的,但細節不是;導致如果是計數,該實現有可能不對;實現見第一段代碼
if(!m[key])//兩種情況:key存在,值爲0,key不存在,自動創建,值爲0;最終都會對錶內對應key,值爲0的項賦值;
m[key]=val;
else
m[key]+=val;
有兩種方式進行數據的插入,第一種是使用下標的方式,也就是[],第二種是使用insert接口,它們主要的區別如下:
下標的方式插入,如果原本key不存在則會先創建對應的記錄,然後再進行賦值,即如果存在,會改變值哦;
insert方式插入,如果key不存在,則插入記錄,如果存在則什麼都不做。如:m.insert(pair<int ,int >(1,2));