//在循环中使用erase需要避免的错误
//erase的函数原型有两种形式:
//iterator erase(iterator position);
//iterator erase(iterator first, iterator last); 左闭右开 [first,last)
vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 9, 10, 9 };
错误示例1
for (auto p1 = v1.begin(); p1 != v1.end();p1++)
{
if (*p1 == 9)
{
v1.erase(p1);
}
}
//p1被erase以后,变成了一个“野迭代器”,对其进行++操作会发生未定义的错误
Return value
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.
会返回指向删掉的元素后面第一个元素的迭代器,如果删掉的是最后一个元素,返回.end()
错误示例2
for (auto p1 = v1.begin(); p1 != v1.end();p1++)
{
if (*p1 == 9)
{
p1=v1.erase(p1);
}
}
1)无法删除两个连续的9; 2)当9位于vector最后位置的时候,也会出错(在ve.end()上执行 ++ 操作)
正确示例
for (auto p1 = v1.begin(); p1 != v1.end();)
{
if (*p1 == 9)
{
p1=v1.erase(p1);
}
else
{
p1++;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。