STL之map

Map概述

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

一、map的说明

1.头文件

#include<map>

2.定义

map<string, int> my_Map;
或者是typedef map<string, int> MY_MAP;
MY_MAP my_Map;

3.插入数据

(1) my_Map[“a”] = 1;
(2) my_Map.insert(map<string, int>::value_type(“b”,2));
(3) my_Map.insert(pair<string,int>(“c”,3));
(4) my_Map.insert(make_pair<string,int>(“d”,4));

4.查找数据和修改数据

(1) int i = my_Map[“a”];
my_Map[“a”] = i;
(2) MY_MAP::iterator my_Itr;
my_Itr.find(“b”);
int j = my_Itr->second;
my_Itr->second = j;
不过注意,键本身是不能被修改的,除非删除。

5.删除数据

(1) my_Map.erase(my_Itr);
(2) my_Map.erase(“c”);
还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。

6.迭代数据

for (my_Itr=my_Map.begin(); my_Itr!=my_Map.end(); ++my_Itr) {}

7.其它方法

my_Map.size() 返回元素数目
my_Map.empty() 判断是否为空
my_Map.clear() 清空所有元素

二、几点注意事项

1.关于插入操作

(1) my_Map[“a”] = 1;
(2) my_Map.insert(map

2. 关于查找

(1)用count函数来判定关键字是否出现,了count函数的返回值只有两个,要么是0,要么是1,查找到返回1。
(2)用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器.

3.关于删除

一下代码把整个map清空
mapStudent.earse(mapStudent.begin(), mapStudent.end());
成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合

三、实例代码

1.study1

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <map>
/*
    目标:熟悉一下map的基础用法
          涉及到插入操作、和迭代器的使用
*/
using namespace std;

int main()
{
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one"));
    mapStudent.insert(pair<int, string>(2, "student_two"));
    mapStudent.insert(pair<int, string>(3, "student_three"));
    map<int, string>::iterator iter;
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){
       cout<<iter->first<<"   "<<iter->second<<endl;
    }
    return 0;
}

2.study2

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <map>
/*
    目标:明确第一个位置的数据永远为关键词,在执行插入操作时一直保持关键词有序
*/
using namespace std;

int main()
{
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one"));
    mapStudent.insert(pair<int, string>(2, "student_two"));
    mapStudent.insert(pair<int, string>(3, "student_three"));
    mapStudent[4] = "TEST";
    map<int, string>::iterator iter;
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){
       cout<<iter->first<<"   "<<iter->second<<endl;
    }
    return 0;
}

3.study3

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <map>
/*
    学习目标:
    区分insert和数组式的插入操作的区别
*/
using namespace std;

int main()
{
    typedef map<string, int> mymap;
    mymap a;
    //数组式插入操作
    a["A"]=0;
    a["C"]=2;
    a["B"]=1;
    mymap::iterator iter;
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    printf("\n");
    a["A"]=1;
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    printf("\n");
    //可以发现这里A的数据被修改为1
    //再使用insert操作试试
    a.insert(pair<string,int>("A",0));
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    //可以发现数据没有发生改变,可以说明插入操作失败


    return 0;
}

4.study4

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <map>
/*
    学习目标:
    获得当前map容器的大小
*/
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    typedef map<string, int> mymap;
    mymap a;

    a["A"]=0;
    a["C"]=2;
    a["B"]=1;
    mymap::iterator iter;
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    //printf("\n");
    cout<<a.size()<<endl;
    return 0;
}

5.study5

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <map>
/*
    学习目标:
    map数据的查找(只能查找first)
    count只能查找是否有,返回值为0或1
    find能查找出是否有,返回值为迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
    意外发现:
    a[first]++;代表first对应的second自增1,前提是second类型是int
*/
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    typedef map<string, int> mymap;
    mymap a;
    a["A"]=0;
    a["B"]=0;
    a["C"]=2;
    a["A"]++;//自增运算
    a["A"]++;
    a["A"]++;
    mymap::iterator iter;
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    int ret = a.count("A");
    mymap::iterator iter1 = a.find("D");
    if(iter1 == a.end()){
        cout<<"NO FIND"<<endl;
    }else{
        cout<<iter1->second<<endl;
    }

    return 0;
}

6.study6

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <map>
/*
    学习目标:
    map数据的清空clearm,判断是否为空可用empty

*/
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    typedef map<string, int> mymap;
    mymap a;
    a["A"]=0;
    a["B"]=0;
    a["C"]=2;
    a["A"]++;//自增运算
    a["A"]++;
    a["A"]++;
    mymap::iterator iter;
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    a.clear();
    iter = a.begin();
    if(a.begin() == a.end()){
        cout<<"EMPTY"<<endl;
    }

    if(a.empty()){
        cout<<"EMPTY"<<endl;
    }

    return 0;
}

7.study7

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <map>
/*
    学习目标:
    map数据的删除erase

*/
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    typedef map<string, int> mymap;
    mymap a;
    a["A"]=0;
    a["B"]=0;
    a["C"]=2;
    a["A"]++;//自增运算
    a["A"]++;
    a["A"]++;
    mymap::iterator iter;
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }
    cout<<endl;
    a.erase("B");
    for(iter = a.begin();iter!= a.end();iter++){
        cout<<iter->first<<"\t"<<iter->second<<endl;
    }

    return 0;
}

四、深度拓展

C++ STL map 用法
STL–迭代器(iterator)使用详解
C++学习之Pair

五、几道水题练练手

HDOJ.1004
HDOJ.1029
HDOJ.1075
HDOJ.1263
HDOJ.2072
HDOJ.2094

六、水题题解

(下面题解中有题目连接)

HDOJ.1029

HDOJ.1075

HDOJ.1263

HDOJ.2072

HDOJ.2094

posted @ 2016-11-18 20:35  pengwill  阅读(110)  评论(0编辑  收藏  举报