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


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

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


erase 函数的两种删除形式:

<strong><span style="font-size:14px;">iterator erase(const_iterator _Where)</span></strong>
<strong><span style="font-size:14px;">iterator erase(const_iterator _First_arg,const_iterator _Last_arg)
</span></strong>


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

<strong><span style="font-size:14px;">int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> 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<int>::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;
}</span></strong>


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

类型一:生成野指针

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

类型二:不完全删除

<strong><span style="font-size:14px;">std::vector<int>::iterator iter = vec.begin();
for (iter = vec.begin(); iter != vec.end(); iter++)
{
	if (*iter == 5)
		iter = vec.erase(iter);
}</span></strong>
这样写的同学 请举手! 

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

类型三:效率低的代码

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

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

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


  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值