转自:https://blog.csdn.net/daofengdeba/article/details/7865229
在vector中由于有多个符合要求的元素需要删除,如果直接删除后,指针直接++就会出现问题,这是因为当erase后,iter就变成了一个野指针,对一个野指针++是一定会出现错误的。
vector<int> veci; veci.push_back(1); veci.push_back(2); veci.push_back(3); veci.push_back(4); veci.push_back(5); veci.push_back(3); veci.push_back(2); veci.push_back(3);
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) veci.erase(iter); }
乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。
查看MSDN,对于erase的返回值是这样描述的:An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists,于是改代码:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) iter = veci.erase(iter); }
这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)
正确的代码应该为:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if( *iter == 3)
iter = veci.erase(iter);
else
iter ++ ;
}
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。