C++ STL map——erase使用示例(竞赛专用)

传入key删除

#include<bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
map<int,double> mp;
int main() {
	
	mp[1]=10;
	mp[2]=100;
	cout<<"删除前"<<'\n';
	for(auto &it: mp){
		cout<<it.ft<<" "<<it.sd<<'\n';
	}
	//key
	mp.erase(1);
	cout<<"删除后"<<'\n';
	for(auto &it: mp){
		cout<<it.ft<<" "<<it.sd<<'\n';
	}
	return 0;
}

在这里插入图片描述

迭代器删除

#include<bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
map<int,double> mp;
int main() {
	
	mp[1]=10;
	mp[2]=100;
	cout<<"删除前"<<'\n';
	for(auto it=mp.begin(); it!=mp.end(); it++){
		cout<<it->ft<<" "<<it->sd<<'\n';
	}
	//迭代器
	auto it = mp.find(1);
	mp.erase(it);
	cout<<"删除后"<<'\n';
	for(auto &it: mp){
		cout<<it.ft<<" "<<it.sd<<'\n';
	}
	return 0;
}

在这里插入图片描述

删除给定范围

#include<bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
map<int,double> mp;
int main() {
	
	mp[1]=10;
	mp[2]=100;
	mp[3]=3;
	mp[5]=9;
	mp[10]=101;
	cout<<"删除前"<<'\n';
	for(auto it=mp.begin(); it!=mp.end(); it++){
		cout<<it->ft<<" "<<it->sd<<'\n';
	}
	//两个迭代器,左闭右开 
	auto it = mp.find(1);
	auto it2 = mp.find(5);
	mp.erase(it,it2);
	cout<<"删除后"<<'\n';
	for(auto &it: mp){
		cout<<it.ft<<" "<<it.sd<<'\n';
	}
	return 0;
}


在这里插入图片描述

注意

当使用了自定义排序的时候,遍历删除的时候要注意越界问题
以下代码运行的时候会报错,好像是越界,具体原因我也不太清楚。

#include<bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
map<int,double,greater<int> > mp;
int main() {
	
	mp[1]=10;
	mp[2]=100;
	for(auto it=mp.begin(); it!=mp.end(); it++){
		if(it->ft==1) mp.erase(it);
	}
	return 0;
}

改成这样就不会了

#include<bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
map<int,double,greater<int> > mp;
int main() {
	
	mp[1]=10;
	mp[2]=100;
	for(auto it=mp.begin(); it!=mp.end(); ){
		if(it->ft==1) it=mp.erase(it); 
		else it++;
	}
	return 0;
}

参考:

  1. https://vimsky.com/examples/usage/map-erase-function-in-c-stl.html
  2. https://www.cnblogs.com/tomcao/p/6011413.html
posted @ 2022-08-28 08:42  翔村亲亲鸟  阅读(60)  评论(0编辑  收藏  举报