c++ vector和map遍历删除的正确姿势

1. vector遍历删除

1.1 错误的方法

vector<int> vec;
for (vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
    
    
	vec.erase(it);
}

错误的原因是执行vec.erase(it)后,使得it已经失效,之后再循环会导致it++报错。

1.2 正确的方法

vector<int> vec;
for (vector<int>::iterator it=vec.begin();it!=vec.end();)
{
    
    
	it = vec.erase(it); //或者vec.erase(it++);
}

2. map遍历删除

map遍历删除与vector存在同样的问题,解决方法也一样

2.1 错误的方法

int main()
{
    
    
	std::map<int, int> mp{
    
     {
    
    1, 2}, {
    
     2,3 }, {
    
     3,4 }};
	for (std::map<int, int>::iterator it = mp.begin(); it != mp.end();)
	{
    
    
		if (it->first == 2)
			mp.erase(it);
		it++;
	}

	for (auto &m : mp)
		std::cout << m.first << std::endl;

	return 0;
}

错误的原因是执行mp.erase(it)后,使得it已经失效,之后再循环会导致it++报错。

2.2 正确的方法

int main()
{
    
    
	std::map<int, int> mp{
    
     {
    
    1, 2}, {
    
     2,3 }, {
    
     3,4 }};
	for (std::map<int, int>::iterator it = mp.begin(); it != mp.end();)
	{
    
    
		if (it->first == 2)
			it = mp.erase(it);//或者mp.erase(it++)
		else
			it++;
	}

	for (auto &m : mp)
		std::cout << m.first << std::endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/wyw0000/article/details/130518951