C++ map

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;

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值