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;//同样输出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;}

0 0