map 是 STL 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在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中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。

#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;