分类
Level5

map

mapSTL 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。

一、什么是pair

pair 是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair。pair的实现是一个结构体,主要的两个成员变量是 first 和second 。pair定义在头文件 utility 中,pair中的每个值都可以是不同的类型。pair的构建和使用:

pair<T1,T2> p1;  //创建一个空的pair对象
pair<T1,T2> p1(v1,v2); //创建一个pair对象,用值v1、v2初始化
make_pair(v1,v2);  //以v1和v2的值创建一个pair对象

p1<p2;    //小于运算,遵循字典次序比较first和second
p1==p2;//first和second依次相等,则这两个对象相等

p1.first;  //返回对象p1中名为first的公有数据成员
p1.second; //返回对象pl中名为second的公有数据成员
#include<iostream>
#include<string>
using namespace std;
int main(){
    //1、pair:存储同学的学号和姓名
    pair<int,string> p1;
    p1.first = 1000;
    p1.second = "Zhang";
    //2、定义pair同时初始化
    pair<int,string> p2(1001,"lilang");
    //3、使用make_pair来创建一个pair
    pair<int,string> p3=make_pair(1003,"Zhao");
    //4、为 pair<int,string> 类型起别名
    typedef pair<int,string> Stu;
    Stu s1(1000,"Zhang");
    Stu s2;
    s2.first = 1002;
    s2.second = "Wang";
    cout<<s2.first<<" "<<s2.second<<endl; //输出1002 Wang 
    //为long long起别名:
    typedef long long LL;
    LL x = 123456789123456789;
    cout<<x<<endl;
	
    pair<int,string> p4(1001,"Wang");
    pair<int,string> p5(1001,"Zhang");
    //比较pair对应的字典码
    cout<<(p4>p5)<<endl; //p4小于p5,输出0 
    return 0;
}

二、map

map:是关联容器的一种,map的每个元素都分为关键字两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同 (multimap允许存储相同键的元素)。 map使用注意:

(1) 第一个可以称为关键字(key), 每个关键字只能在map中出现一次,第二个可能称为该关键字的值(value):

例如:map<string,int> a; //可将字符串映射为整数map<double,int> a; //可以将双精度浮点数映射为整数

(2) map中的元素是一对数据 <关键字,数值>, 这个概念在STL中有专门的数据结构叫pair, 有一个相关函数make_pair和两个成员名:first、second 。

(3) pair:pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair, pair 的实现是一个结构体,主要的两个成员变量是first和second。

(4) 注意:不能直接修改map容器中的关键字。因为map中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。

map的常用函数
#include<iostream> 
#include<map>
using namespace std;
int main(){
    //1、定义一个map,默认根据key升序排序 
    map<int,string> m1;
    map<int,string,greater<int> > m2; //greater降序,less升序
    m1[1000]="Zhang"; //为map元素赋值
    m1[1002]="Zhao";
    m1[1003]="Sun";
    m1[1001]="Wang";
    m1[1000]="Li"; //Li会覆盖Zhang
    //2、获取键(关键字key)为1000的值 
    cout<<m1[1000]<<endl;
    //3、利用make_pair创建pair插入到map中
    //如果插入pair,相同的key不会有后面的value覆盖前面value的效果 
    pair<int,string> p1(1004,"Zhou");
    pair<int,string> p2(1004,"Wu");
    m1.insert(p1);
    m1.insert(p2); //p2不会覆盖p1
    //4、erase 删除key为1003的pair 
    m1.erase(1003);
    //由于map支持双向迭代器,因此不能用迭代器+x或者迭代器-X
    m1.erase(m1.begin());
    //定义迭代器指针
    map<int,string>::iterator it;
    //5、find:获取指定元素的位置迭代器
    it=m1.find(1003);
    //it != m.end()
    if(m1.count(1003)){
	cout<<"1003 找到了,值为:"<<it->second<<endl;
    }else{
	cout<<"1003 找不到! "<<endl;
    }
	
    for(it=m1.begin();it!=m1.end();it++){ //遍历map
        cout<<it->first<<" "<<it->second<<endl;
    }
    return 0;
}

multimap 用于维护多映射,即键值可以重复,映射值也可以重复,因此不支持 [] 和 at() 访问,其他操作类型 multiset。

multimap<int,int> mp;
mp.insert({1,2});
mp.insert({1,2});
for(auto i:mp) cout<<i.first<<' '<<i.second<<endl;
mp.insert({1,2});
mp.insert({1,3});
for(auto i:mp) cout<<i.first<<' '<<i.second<<endl;