[英]Segmentation fault in C++ program
我在链表实现中使用STL列表,但是当我在循环中使用擦除功能时,它给出了分段错误。 有人可以告诉我为什么会这样吗?
void remove(list<int> &myList,int N){
int k = 1;
list<int>::iterator it;
for(it = myList.begin(); it != myList.end();it++){
if(k == N){
myList.erase(it);
k = 1;
}
else
k++;
}
}
当您在迭代器上调用擦除时,它将使该迭代器无效。 但是您继续使用它。 您需要捕获擦除的返回值,并将其分配回迭代器,如下所示:
it = myList.erase(it);
但这将需要在循环中稍作更改。 如果擦除,则您不想增加,因为那样您将跳过一个元素。 如果您最终删除了最后一个元素,则尤其糟糕,因为这时您将越过结束迭代器。 所以, 如果你不删除,你应该只增加:
for(it = myList.begin(); it != myList.end(); ){
if(k == N){
it = myList.erase(it);
k = 1;
}
else
{
k++;
++it;
}
}
如果擦除元素,则其迭代器将变为无效。 换句话说,当您到达下一个迭代时,您将执行it++
,此操作不再具有意义,因为it
不再指向列表的元素。
像这样做,
void remove(list<int> &myList,int N){
int k = 1;
list<int>::iterator it;
for(it = myList.begin(); it != myList.end();){
if(k == N){
myList.erase(it++);
k = 1;
} else{
++it;
k++;
}
}
}
当执行代码myList.erase(it ++)时,迭代器“ it”表示的对象无效。因此,未定义执行“ it ++”的对象
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.