map的键和值可以是不同的类型,键是唯一的,每个键都对应一个值。multimap与map类似,只是允许一个键对应多个值。map可被当做哈希表使用,它建立了从键(关键字)到值的映射。
map是键和值的一一映射。
multimap是一对多映射。
使用map或multimap时需要引入头文件
#include<map>
map的迭代器和set类似,支持双向访问,不支持随机访问,执行一次“++”和“--”操作的时间复杂度均为O(logn)。默认的元素顺序为升序也可以通过第3个模版参数设置为降序。
map<string,int> a;
map<string,int,greater<int> > b;
上述map模版的第1个参数为键的类型,第2个参数为值的类型,第3个可选,用于对键进行排序的比较函数或对象。
在map中,键和值是一对数,可以使用make_pair生成一对数(键,值)进行插入。
a.insert(make_pair(s,i));
输出时可以分别输出第一个元素(键)和第二个元素(值)
for(map<string,int>::iterator it=a.begin();it!=a.end();it++){
cout<<it->first<<"\t"<<it->second<<endl;
}
成员函数
-
size/empty/clear:元素个数、判断、清空。
-
begin/end:开始位置和结束位置。
-
insert(x):将元素x插入集合(x为二元组)。
-
erase(x):删除所有等于x的元素(x为二元组)。
-
erase(it):删除it指向的元素(it为指向二元组的迭代器)。
-
find(k):查找键为k的二元组的位置,若不存在,则返回尾指针。
可以通过 " [ ] " 操作符直接得到键映射的值,也可以通过赋值操作改变键映射的值,例如h[key]=val。
例如:可以用map统计字符串出现的次数
int n;
string s;
map<string,int> mp;
cin>>n;
for(int i=0;i<n;i++){
cin>>s;
mp[s]++;
}
cout<<"输入字符串s,查询该字符串出现的次数:"<<endl;
cin>>s;
cout<<mp[s]<<endl;
需要特别注意的是,如果查找的key不存在,则执行h[key]之后会自动新建一个二元组(key,0)并返回0,进行多次查找之后,有可能包含很多无用的二元组。因此使用查找时最好先查询key是否存在。
multimap和map类似,不同的是一个键可以对应多个值。由于是一对多的映射关系,multimap不能使用“[ ]”操作符。例如,可以添加多个关于X国的数据:
map<string,int>mp;
string s1["X"],s2["Y"];
mp.imsert(make_pair(s1,50));
mp.imsert(make_pair(s1,55));
mp.imsert(make_pair(s1,60));
mp.imsert(make_pair(s2,30));
mp.imsert(make_pair(s2,20));
mp.imsert(make_pair(s1,10));
输出所有有关于X国的数据
//输出所有有关于X国的数据
multimap<string,int>::iterator it;
it=mp.find(s1);
for(int k=0;k<map.count(s1);it++){
cout<<it->first<<"--"<<it->second<<endl;
}
插入元素
map<int ,string> student;
//数组方式赋值(注意:数组赋值的方式 如果有重复的key,后面的键值会覆盖前面的
student[0]="zhangsan";//key=0 ,
遍历方式
map<int,string>::iterator it;
for(it=student.begin();it!=student.end();it++) cout<<it->first<<":"<<it->second;
for(auto it=student.begin();it!=student.end();it++) cout<<it->first<<":"<<it->second;
for(auto it :student) cout<<it.first<<":"<<it.second;
判断数据是否插入成功
//判断数据是否插入成功
pair<map<int,string>>::iterator,bool> insert_pair;
insert=student.insert(map<int,string>::value_type(3,"sushi"));
//boolkakpha-----可以把原本是0和1的布尔值变成true和false
cout<<"是否加入成功:"<<boollalpha<<insert_pair.second<<endl;
查找元素
当所查找的关键key出现时,他返回数据所在对象的位置,如果没有,返回iter与end函数的值相同。
//查找map中的键值
map<int,string>::iterator it2;
it2=student.find(1);//这里的1是key值
if(it2!=student.end()) cout<<it2;
else cout<<"no found";
删除元素
//删除元素的方法一:迭代器的方式
map<int,string>::iterator it2;
it2=student.find(1);
student.erase(it2);
//删除元素的方法二:直接给key值删除对应的元素
student.erase(2);
key和map都是用string类型
//key和value都用string类型
map<string,string> student2;
//用数组的方式进行赋值
student2["0"]="zhangsan";
student2["1"]="lisi";
student2["2"]="wangwei";
map<string,string>::iterator it3;
it3=strudent2.find("2");
for(it3=student2.begin();it3!=student2.end();it3++) cout<<it3->first<<": "<<it3->second<<endl;