#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> sList;
list<int>::iterator sP;
sList.push_back(1);
sList.push_back(2);
sList.push_back(3);
for (sP = sList.begin();sP != sList.end();sP++)
{
if (*sP == 3)
{
sP = sList.erase(sP);
}
}
}
改正的过程:
```cpp
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> sList;
list<int>::iterator sP;
sList.push_back(1);
sList.push_back(2);
sList.push_back(3);
for (sP = sList.begin();sP != sList.end();)
{
if (*sP == 3)
{
sP = sList.erase(sP);
continue;
}
sP++;
}
/*if (*sP == 3)
{
sP = sList.erase(sP);
}
else
{
sP++;
}*/
for (sP = sList.begin();sP != sList.end();sP++)
{
cout << *sP << endl;
}
return 0;
}
运行结果:输出1 2
### 分析:
容器中使用erase(p)删除元素时,删除迭代器p所指定的元素,返回一个指向被删除元素之后元素的迭代器。若p指向尾元素,则返回尾后迭代器。若p是尾后迭代器,则函数行为无意义。通俗点,删除函数erase()自带+1的功能,容器中间删除不易出错,一旦删除的是最后一个元素,将直接直线个尾后元素,此时for循环中的加1失效。也就是流程图中的增量步骤无效导致运行失败。
这里边涉及for循环的运行过程的理解。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020120116150650.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzY4Mjk2,size_16,color_FFFFFF,t_70)