STL——map的用法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章