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;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐