刷题使用c++哈希表-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()

这里是需要注意的点了:

  1. map里是有find函数可以调用的,不可以和algorithm里面的混淆。
  2. 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两个篮子摘果子的,不回忆了,可以拿这些题去练手)

在这里插入图片描述

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假正经的小柴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值