c++语言 list的使用出错 触发断点

来源:百度知道 编辑:UC知道 时间:2024/06/14 05:38:59
#include"iostream"
#include"list"
using namespace std;
bool check(list<int>&lst);
int main()
{
list<int> lst;
lst.push_front(10);
lst.push_front(15);
lst.push_front(18);
check(lst);
return 0;
}
bool check(list<int>&lst) //实现功能;给出一组数 这些数相加减 若能等于1则返回true 否则 返回FALSE
{ //例如:(10,15,18)=18+18+18-10-15-15-15=1返回true;
list<int>::iterator il,i2;int t,min=lst.front(); //递归示例:
for(il=lst.begin ();il!=lst.end();il++) //check(10,15,18)=check(10,15%10,18%10)=check(10,5,8)
{ //=check(10%5,5,8%5)=check(0,5,3)=check(5,3)=check(2,3)=check(2,1)=check(0,1)=check(1)
if(*il<min) //仅剩下一个点且为1返回true;
{
min=*il;i2=il;
} //迭代找到最小值;
}
for(il=lst.begin ();il!=l

错误1:
for(il=lst.begin ();il!=lst.end();il++)
{
if(il!=i2)
{
t=*il%min; //除最小值之外 都赋值为原数%最小值
if(t>0) *il=t; //并用erase 删除(原数%最小值)=0的点;
else *lst.erase(il);
}
}

这段循环问题很大。
lst.erase(il); 执行完后, il 指向一个无效的位置,再执行 il++ 必然出错。
在这里我们需要得到删除 il 之后的下一个元素的位置,并将其赋给 il
好在 lst.erase(il) 的返回值正是我们所需的。所以这句改为
il = lst.erase(il); 即可。

但还没有结束。
当执行 il = lst.erase(il); 之后,il 已经指向下一个位置了,但根据 for 循环,下一步仍然执行 il++ 。这显然不是我们想要的,所以需要改变 il++ 这句的位置。综上,以上 for 循环改为如下:

for(il=lst.begin ();il!=lst.end();)
{

if(il!=i2)
{
t=*il%min; //除最小值之外 都赋值为原数%最小值
if(t>0) *il=t; //并用erase 删除(原数%最小值)=0的点;
else {
il = lst.erase(il);
continue;
}
}
il++;
}
当执行 il = lst.erase(il); 语句后直接 continue 跳过 il++; 即可。

错误2:
for(il=lst.begi