知道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;
}