关于 vector 中 erase 函数的使用注意事项


做项目时,总是会时不时的遇到新的问题,作为一个后来者,总是有一些文章或者前辈可以得到参考或者指点。

今天,就碰到了关于 vector 的 erase 函数的使用问题,下面就和大家一起来分享一下对 erase 函数的感悟:


erase 函数的两种删除形式:

iterator erase(const_iterator _Where)
iterator erase(const_iterator _First_arg,const_iterator _Last_arg)


我不知道你是不是一下子能写出下面的代码,当然这是很正确的程序,请注意:5 有两个,这是我们测试数据用的,所以 push 了两次

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector vec;
	vec.push_back(0);
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);
	vec.push_back(5);
	vec.push_back(6);
	vec.push_back(7);
	vec.push_back(8);

	
	std::vector::iterator iter = vec.begin();
	for (iter = vec.begin(); iter != vec.end(); )
	{
		if (*iter == 5)
			iter = vec.erase(iter);
		else
			iter++;
	}

	for (iter = vec.begin(); iter != vec.end(); iter++)
	{
		std::cout<<*iter<<"  ";
	}

	
	return 0;
}


下面我就来分析一下我们常犯的错误类型:

类型一:生成野指针

std::vector::iterator iter = vec.begin();
for (iter = vec.begin(); iter != vec.end(); iter++)
{
	if (*iter == 5)
		vec.erase(iter);
}
这样的同学要罚站! iter 在删除后 变成了野指针,而循环再次使用 iter 的时候的时候,就会产生 崩溃!!!

类型二:不完全删除

std::vector::iterator iter = vec.begin();
for (iter = vec.begin(); iter != vec.end(); iter++)
{
	if (*iter == 5)
		iter = vec.erase(iter);
}
这样写的同学 请举手! 

可以运行,但是请注意观察运行结果,只删除掉一个 5 ,而输出中还有一个 5。 为什么?自己分析!

类型三:效率低的代码

std::vector::iterator iter = vec.begin();
for (iter = vec.begin(); iter != vec.end(); iter++)
{
	if (*iter == 5)
	{
		vec.erase(iter);
		iter = vec.begin();
	}
}
注意分析这段代码与 上述正确代码的区别:分析效率方面的问题,这里你自己动脑想想吧!

作为一名程序员,我们需要渴求写出简洁、高效的代码!

还有一些其他的错误或者效率较低的类型,我这里写出了几种常见或者容易犯的问题类型。希望对你有益!


你可能感兴趣的:(C++)