C 程序中的分割故障
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"表示的对象无效。
相关文章:
- 分割故障C++矩阵
- C ,二进制树的高度,而不是检查我的子树是否为空,而是在检查我的子树是否是叶子节点.抛出分割故障
- 我正在为此代码分割故障
- 在执行strcpy时获取分割故障错误
- 空隙指针分割故障
- Xcode会产生分割故障,而不是例外
- OPENCV C 中的分割故障误差
- 分割故障:核心倾倒C 矢量对字符串:
- C 2D数组导致分割故障(核心倾倒)
- 分割故障/错误读数变量-C 列表
- DLSYM导致分割故障
- 使用C 中的操作员删除的分割故障
- 使用Linux X64下的Libmozjs-52(SpidermonKey)进行分割故障
- 使用长变量时分割故障(11)错误
- C - 返回字符串时的分割故障
- 创建VertexArray时的分割故障
- 向量分割故障的向量
- 从std :: fileSystem ::路径对象的类中退出时的分割故障
- C 矢量分割故障
- 基于向量的数据格式的分割故障误差