C++程序中的分段错误

nee*_*eel 0 c++ stl segmentation-fault

我正在使用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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 6

在迭代器上调用erase时,它会使该迭代器失效.但是你继续使用它.您需要捕获erase的返回值,并将其返回给迭代器,如下所示:

it = myList.erase(it);
Run Code Online (Sandbox Code Playgroud)

但这需要你的循环稍微改变一下.如果你擦除,那么你不想增加,因为那样你将跳过一个元素.如果你最终删除最后一个元素,这尤其糟糕,因为那样你将移动到结束迭代器.所以,如果你不擦除,你应该只增加:

for(it = myList.begin(); it != myList.end(); ){
    if(k == N){
        it = myList.erase(it);
        k = 1;
    }
    else
    {
        k++;
        ++it;
    }
}
Run Code Online (Sandbox Code Playgroud)