STL——map的用法
来源:互联网 发布:混合高斯背景建模算法 编辑:程序博客网 时间:2024/06/08 00:52
知道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;//同样输出4565.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;}
0 0
- STL——map的用法
- STL——map的用法
- STL — map容器用法的详解
- STL——map用法
- STL的map用法
- STL的map用法
- STL的map用法
- stl--<map>的用法
- stl map的用法
- STL map的用法
- STL--- map的用法
- STL map的用法
- stl map的简单用法
- Map容器的用法(STL)
- Map容器的用法(STL)
- STL中map的用法
- STL中MAP的用法
- STL 中 map 的用法
- C语言中动态内存分配 malloc realloc calloc 的使用和比较
- 第八周 oj 求值
- 欢迎使用CSDN-markdown编辑器
- GO 语言冒泡排序、输出100以内所以素数的小程序
- 认识HTML5的WebSocket
- STL——map的用法
- 阿里云ECS用jemdoc作学术简历
- xamp设置web服务器
- 三点确定一个圆的计算方法
- 为什么选择Netty作为基础通信组件?
- hadoop的job提交的源码分析
- ios,swift 给控件(UIImageView,UIView,UILable)添加响应事件
- 关于 Javascript 学习,有哪些好的博客或者网站推荐?
- Go-多文件构建