知道map的用法,能很好的解決,字符串和數值的對應關係
如:一個姓名對應一個學號,就可以用
map<string,ing>mp;
mp["li"]=1012;
mp["zhang"]=1013;
1.頭文件#include <map>
2.構造一個map map<string,int>mp;
3.數據的插入
第一種:直接
m1["name1"]=11;
第二種:insert插入pair數據
m3.insert(pair<string,int>("name3",333));//第一種寫法的
m3.insert(make_pair("name3",333));//第二中跟第一種作用一樣,即是用make_pair()的簡化
第三種:m4.insert(map<string,int>::value_type("name44",4444));
4.用insert插入數據時,集合的唯一性,同一個關鍵詞,插入不了數據
如:在m1["name1"]已經爲11的情況下
m1["name1"]=456;
cout<<m1["name1"]<<endl;//輸出456,可以覆蓋
m1.insert(map<string,int>::value_type ("name1",789));
cout<<m1["name1"]<<endl;//輸出爲456,,表示insert沒有插入進去
m1.insert(make_pair("name1",789));
cout<<m1["name1"]<<endl;//同樣輸出456
5.map的遍歷(內部有排序,按前一個數據類型)
cout<<"第一種:前向迭代器遍歷"<<endl;
map<string,int>::iterator iter11;
for(iter11 = m4.begin(); iter11 != m4.end(); iter11++)
{
cout<<iter11->first<<" "<<iter11->second<<endl;
}
cout<<"第二種:反向迭代器遍歷"<<endl;
map<string,int>::reverse_iterator iter22;
for(iter22 = m4.rbegin(); iter22 != m4.rend(); iter22++)
{
cout<<iter22->first<<" "<<iter22->second<<endl;
}
兩個輸出分別爲
第一種:前向迭代器遍歷(升序)
name22 4444
name33 2222
name44 4444
第二種:反向迭代器遍歷(降序)
name44 4444
name33 2222
name22 4444
也可以用數組遍歷:對於map<int,string>mp;這樣的
6.數據的查找
第一種:用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置,由於map的特性,一對一的映射關係,就決定了count函數的返回值只有兩個,要麼是0,要麼是1,出現的情況,當然是返回1了
如:
if(!m.count("name")) //如果name這個關鍵字不存在的話,
if(mm.count(1))如果1這個數字關鍵詞存在
第二種:用find函數來定位數據出現位置,它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等於end函數返回的迭代器
7.基本操作
m.empty()
m.clear()
m.size()
m.insert()
m.erase()
m.begin()
m.end()
8.如果是map存放結構體
沒有定義比較<,>的比較方法,所以可以,用重載<來比較結構體
struct node
{
string a;
int b;
bool operator < (const node &aa)const
{
if(a==aa.a) return b<aa.b;//如果a等的話,b大的優先級高
return a<aa.a;//否則,a大的優先級高。。。。好像一個map比顯然只能這樣??,唉管他呢
}//那直接return a<aa.a;吧
};
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
map<string,int>m1;
map<int,string>m2;
map<string,int>m3;
map<string,int>m4;
map<string,int>m5;
int main()
{
//直接數組插入
m1["name1"]=123;
m2[456]="name2";
cout<<m1["name1"]<<endl;
cout<<m2[456]<<endl<<endl;
//用make_pair()和insert()插入操作
m3.insert(pair<string,int>("name3",333));//可以簡化成下面這兩個
m3.insert(make_pair("name5",555));//一般這樣寫就好
m3.insert(make_pair("name4",444));
map<string,int>::iterator iter;
for(iter = m3.begin(); iter != m3.end(); iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;//用迭代器遍歷輸出,這是前向迭代器(升序)
}
cout<<endl;
//用value_type()和insert()插入操作
m4.insert(map<string,int>::value_type("name44",4444));
m4.insert(map<string,int>::value_type("name22",4444));
m4.insert(map<string,int>::value_type("name33",2222));
map<string,int>::iterator iter1;
for(iter1 = m4.begin(); iter1 != m4.end(); iter1++)
{
cout<<iter1->first<<" "<<iter1->second<<endl;
}
cout<<endl;
//驗證插入能否覆蓋,數組可以覆蓋,insert不能覆蓋
m1["name1"]=456;
cout<<m1["name1"]<<endl;
m1.insert(map<string,int>::value_type ("name1",789));
cout<<m1["name1"]<<endl;
m1.insert(make_pair("name1",789));
cout<<m1["name1"]<<endl;
//map輸出方式
cout<<"第一種:前向迭代器遍歷"<<endl;
map<string,int>::iterator iter11;
for(iter11 = m4.begin(); iter11 != m4.end(); iter11++)
{
cout<<iter11->first<<" "<<iter11->second<<endl;
}
cout<<"第二種:反向迭代器遍歷"<<endl;
map<string,int>::reverse_iterator iter22;
for(iter22 = m4.rbegin(); iter22 != m4.rend(); iter22++)
{
cout<<iter22->first<<" "<<iter22->second<<endl;
}
cout<<"第三種:數組遍歷"<<endl;
cout<<endl;
//數據的查找
cout<<"第一種:不等找到確定位置的,用m.count()"<<endl;
if(m4.count("name44"))
cout<<"存在44"<<endl;
else cout<<"不存在44"<<endl;
if(m4.count("name55"))
cout<<"存在55"<<endl;
else cout<<"不存在55"<<endl;
cout<<"第二種:能定位出現位置的,用find函數(用到迭代器)"<<endl;
map<string,int>::iterator iter111;
iter111 = m4.find("name22");
if(iter111 != m4.end())
cout<<"找到22,且值是 "<<iter111->second<<endl<<endl;
else
cout<<"未找到22"<<endl<<endl;
//刪除
cout<<"用迭代器刪除"<<endl;
map<string,int>::iterator iter1111;
iter1111 = m4.find("name44");
m4.erase(iter1111);
for(iter1111 = m4.begin(); iter1111 != m4.end(); iter1111++)
{
cout<<iter1111->first<<" "<<iter1111->second<<endl;//驗證
}
cout<<"用關鍵字刪除"<<endl;
int n = m4.erase("name22");//如果刪除了會返回1,否則返回0
cout<<(n==1?"刪除了name22":"未刪除name22")<<endl;
//用迭代器,成片的刪除,下面的操作,把整個map清空,刪除區間是一個前閉後開的集合
cout<<"成片的刪除"<<endl;
m4.erase(m4.begin(), m4.end());
map<string,int>::iterator iter1112;
for(iter1112 = m4.begin(); iter1112 != m4.end(); iter1112++)
{
cout<<iter1112->first<<" "<<iter1112->second<<endl;//驗證
}
cout<<"此時清空了"<<endl;
/*
456
456
第一種:前向迭代器遍歷
name22 4444
name33 2222
name44 4444
第二種:反向迭代器遍歷
name44 4444
name33 2222
name22 4444
第三種:數組遍歷
第一種:不等找到確定位置的,用m.count()
存在44
不存在55
第二種:能定位出現位置的,用find函數(用到迭代器)
找到22,且值是 4444
用迭代器刪除
name22 4444
name33 2222
用關鍵字刪除
刪除了name22
成片的刪除
此時清空了
*/
return 0;
}