map和unordered_map
为啥写这篇博客
最近刷题总能碰到用哈希表解题,可能最近刷数组和字符串相关的题比较多吧,然后就使用它比较多,说几下使用时要注意的点和我刷的那些用到了的题(不是只有用哈希表解题的题,是我用它解题的题)。
map和unordered_map
unordered_map和map的区别就是map是会将键值对根据(key)进行排序的,而unordered_map不会,而且map中不允许存在键值相同的键值对。(个人刷题碰到要用它的一般都是用unordered_map,但map也有它的好处,比如它会直接进行键值排序)
map_name.erase()
我们用erase()删除map里面的成员一般习惯都是像vector容器那样用迭代器删除,但还有一种删除形式,我刷题看别人评论题解无意看到的(开始不知道,学的时候学的不够全)
可以通过删除键(key)去删除掉map里面对应的成员,对应的句式:map_name.erase(key);
举个例子:
#include<bits/stdc++.h>
using namespace std;
int main(){
unordered_map<int,int> mp;
// 插入三个键值对
mp.insert(make_pair<int,int>(8,999));
mp.insert(make_pair<int,int>(7,888));
mp.insert(make_pair<int,int>(6,777));
//遍历这些键值对
cout<<"Before delete key-value:"<<endl;
for(auto it = mp.begin();it!=mp.end();++it){
cout<<it->first<<" "<<it->second<<endl;
}
//删除键(key)为6的成员
mp.erase(6);
//遍历删除后的键值对
cout<<"After delete one key-value:"<<endl;
for(auto it = mp.begin();it!=mp.end();++it){
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
输出:
map_name.find()
这里是需要注意的点了:
- map里是有find函数可以调用的,不可以和algorithm里面的混淆。
- map中find函数里面的参数是和key对应的,(不是value)是查找key对应的对键值,返回值和algorithm中的find一样,是key对应的迭代器。没查到就返回map_name.end();
map_name.size()
就是返回map键值对的个数,函数返回值意义和其他容器是一样的,只是比较常用,还是提一下
map_name.insert()和其“映射插入”
句式:map_name.insert(make_pair<T1,T2>(a,b));与map_name[a] = b;等价
举例:
#include<bits/stdc++.h>
using namespace std;
int main(){
unordered_map<int,int> mp;
// 插入三个键值对
mp.insert(make_pair<int,int>(8,999)); //和mp[8] = 999一致
mp.insert(make_pair<int,int>(7,888)); //和mp[7] = 888一致
mp.insert(make_pair<int,int>(6,777)); //和mp[6] = 777一致
//遍历这些键值对
for(auto it = mp.begin();it!=mp.end();++it){
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
注意点:
map和unordered_map是关联式容器,不可以使用algorithm库里面的一些函数,比如sort,想使用的话可以把map里面的成员存取到vector<pair<T,T>>,然后再进行sort,而且这种方式也可以对unordered_map里面的value进行排序,而即使用map,那也只是key是对应有序的。
最近碰到的,用它可以解决的题目(前面几天博客中的,里面有简便版解析)
该篇博客中的第三题:290.单词规律和763.划分字母区间
该篇博客中的最后一题:560.和为k的子数组
(题很多找不着了,比如还有昨天刷到的一道leetcode两个篮子摘果子的,不回忆了,可以拿这些题去练手)