一、map
map是STL中的一种关联容器,可以将任何基本类型映射到任何基本类型(包括STL容器),映射前的类型称为key(键),映射后的类型称为value(值)。map可以自动建立键值对的对应,并且会以键从小到大的顺序自动排序。
1.map基本用法
(1)头文件
#include <map>
using namespace std;
(2)定义
不同于其他stl容器,map在定义时需要确定键typename1和值typename2,已完成typename1到typename2的映射,typename可以是基本数据类型也可以是stl容器。
map<typename1,typename2> m;
map<string,int> m1;
map<set<int>,string> m2;
(3)元素访问
使用下标访问:键作为索引可以得到对应的值
要注意的是map中的键是唯一的,对同一个键赋值会对之前的值进行覆盖。
map<int,char> m;
m[1]='a';
printf("%c\n",m[1]); //a
m[1]='b';
printf("%c\n",m[1]); //b
使用迭代器访问:
迭代器可以同时访问每个键值对的键和值,it->first访问键,it->second访问值。
for(map<int,char>::iterator it=m.begin();it!=m.end();it++)
printf("%d %c\n",it->first,it->second);
2.map常用函数
(1)size()
获得map中键值对的个数
(2)find()
find(key)返回键为key的映射的迭代器
map<int,char> m;
m[1]='a';
m[2]='b';
map<int,char>::iterator it=m.find(1);
printf("%d %c\n",it->first,it->second); //1 a
(3)erase()
删除单个元素:erase(it),it为需要删除的映射的迭代器
map<int,char> m;
m[1]='a';
map<int,char>::iterator it=m.find(1);
m.erase(it);
printf("%d\n",m.size()); //0
或者erase(key),key为需要删除的映射的键
map<int,char> m;
m[1]='a';
m.erase(1);
printf("%d\n",m.size()); //0
删除一个区间内的所有元素:erase(begin,end),begin和end分别为区间的首尾迭代器,左闭右开。
map<int,char> m;
m[1]='a';
m[2]='b';
m[3]='c';
map<int,char>::iterator it=m.find(2);
m.erase(it,m.end()); //删除it之后的所有映射
for(it=m.begin();it!=m.end();it++)
printf("%d %c\n",it->first,it->second); //1 a
(4)clear()
清空map中所有映射
二、pair
pair是将两个元素合成在一起的小容器,可以看成是含有两个元素的结构体,两个元素均可以是任意的数据类型。
pair基本用法
(1)头文件
#include <utility>
using namespace std;
map内部实现涉及到pair,在导入map头文件时会自动导入utility头文件,因此要使用pair也可以直接使用和map相同的头文件:
#include <map>
using namespace std;
(2)定义
pair<typename1,typename2> p;
pair<string,int> p1;
patr<int,char> p1(1,'a'); //定义时进行初始化
如果想要临时使用一个pair可以用下面两种方法定义:
p1=pair<int,char>(1,'a');
p2=make_pair(1,'a');
(3)元素访问
p.first访问第一个元素,p.second访问第二个元素
一个简单实例:
#include <stdio.h>
#include <utility>
using namespace std;
int main(){
pair<int,char> p1(1,'a');
pair<int,char> p2;
p2.first=2;
p2.second='b';
printf("%d %c\n",p1.first,p1.second);
printf("%d %c\n",p2.first,p2.second);
p1=pair<int,char>(3,'c');
printf("%d %c\n",p1.first,p1.second);
p1=make_pair(4,'d');
printf("%d %c\n",p1.first,p1.second);
return 0;
}
运行结果:
1 a
2 b
3 c
4 d
(4)pair之间的比较
两个pair之间可以直接使用==、!=、<、<=、>、>=进行比较,先对第一个元素进行比较,如果相等再对第二个元素进行比较。
pair<int,int> p1(1,2);
pair<int,int> p2(1,3);
pair<int,int> p3(2,1); //p1<p2<p3
printf("%d %d\n",p1<p2,p1<p3,p2>p3); //1 1 0