# 映射表
在c++中,我们构造一个map的方法为
map<T1,T2> m;
构造了一个名为m的从T1类型,到T2类型的映射
T1和T2可以是char,int,string……
初始的时候m是一个空映射,通过写
map<int,string> m;
构造了一个字符串到一个整数的映射,将字符串和整数关联起来.
插入方法:
在c++中通过insert在映射表中插入一组新的映射,参数是一个pair。
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,头文件是。
make_pair(v1,v2);
函数返回由v1和v2初始化的pair。
如果之前插入的key不存在了,那么将无法插入新的value替代原来的value。
#include<utility>
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string,int> m;
m.insert(make_pair("Emliy",1));
//{"Emliy"->1}
m.insert(make_pair("Tony",2));
//{"Emliy"->1}{"Tony"->2}
m.insert(make_pair("Angela",2));
//{"Emliy"->1}{"Tony"->2}{"Angela"->2}
m.insert(make_pair("Tony",1));
//{"Emliy"->1}{"Tony"->2}{"Angela"->2}
return 0;
}
访问方法:
在C++中,访问映射和访问数组的方法及其相似,都是直接用[ ]就可以访问,比如通过m[“Emliy”]就可以访问"Emliy"对应的值了。
有个比较神奇的地方是:当你访问一个你没有做过映射的值,会自动生成一个映射,为默认值(int的默认值是0,string的默认值是一个空字符串)。
判断是否存在
用count()查找关键字是否被映射过,映射过返回1,没映射过返回0。
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int main(){
map<string,int> m;
m["Tony"]=1;
m["Amy"]=2;
m["Jonny"]=1;
if(m.count("Tony"))
cout<<"Tony is in class"<<m["Tony"]<<endl;
else
cout<<"Tony is not in class"<<endl;
return 0;
}
输出结果
Tony is in class 2
遍历映射
map的迭代器和set差不多,map<T1,T2> :: iterator it,就定义了一个新的迭代器。
有first和second两个成员变量,分别代表映射的key和value。
用->运算符来取值,it->first和(*it).first用途相同。
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int main(){
map<string,int> m;
m["Tony"]=1;
m["Amy"]=2;
m["Jonny"]=1;
for(map<string,int> :: iterator it=m.begin();it!=m.end();it++){
cout<<it->first<<"->"<<it->second<<endl;
}
return 0;
}
输出结果
Amy->2
Jonny->1
Tony->1
注意:是按照关键字顺序遍历的,这点和set很相似
清除元素
用clear()函数,即可清除map和map所占的内存。
map总结(大多数)
insert 插入一对映射 O(logn)
count 判断关键字是否存在 O(logn)
size 获取映射对个数 O(1)
clear 清空 O(n)