vector::erase()函数调用出错问题

vector::erase()函数调用出错问题

vector::erase()方法有两种重载形式

iterator erase(   iterator _Where);//删除某个元素

iterator erase(   iterator _First,   iterator _Last);//删除一段元素,注意是个半开区间

返回值:

如果是删除指定位置的元素时,返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;


如下代码:
#include "stdafx.h"
#include<iostream>
#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector <int> v1;  
vector <int>::iterator Iter,iter1;  
v1.push_back(10);
v1.push_back(10);
v1.push_back( 20 );  
v1.push_back( 30 );  
v1.push_back( 40 );  
v1.push_back( 10 ); 
for(Iter = v1.begin(); Iter != v1.end(); Iter++)  
{     
if(*Iter == 10)  
{         
v1.erase(Iter);  
}   
}  
return 0;
}

乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

for循环做如下改动:

for(Iter = v1.begin(); Iter != v1.end(); Iter++)  
{     
if(*Iter == 10)  
{         
Iter = v1.erase(Iter);  
}   
}  

代码仍然是错误的。为什么呢?????

断点单步调试发现两个问题:

(1)两个连续的10,只删掉了一个??

原因是删掉第一个10后,iter指向了第二个10的位置,然后iter++,跳过了这个10.

(2)删除最后一个10时出现问题??

原因是结尾的10删掉后,iter指向了v1.end()位置,再iter++肯定有错。

所以这种写法(1)不能删除连续的值(2)不能删除末尾的值,会报错


正确的代码应该为:

for(Iter = v1.begin(); Iter != v1.end(); )  
{     
if(*Iter == 10)  
{         
v1.erase(Iter);  
}   

            else

                  Iter++;
}  



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值