C++ STL列表迭代器超出范围

C++ STL列表迭代器超出范围,c++,list,stl,containers,C++,List,Stl,Containers,我不知道为什么我的代码中会发生这个错误。(实际上,这是我第一次使用std::list。)当我使用它时,它会使错误“列表迭代器超出范围”,当我使用它时,它会使错误“列表迭代器不可递增”。请帮帮我 #包括 #包括 #包括 #包括 使用名称空间std; typedef struct tag_vpos{int data;list::iterator pos;}vpos; 列表行[100]; 堆栈保存[100]; 整数列[100][100],n,r,行大小[100]; //国际行[100][100];

我不知道为什么我的代码中会发生这个错误。(实际上,这是我第一次使用std::list。)当我使用它时,它会使错误“列表迭代器超出范围”,当我使用它时,它会使错误“列表迭代器不可递增”。请帮帮我

#包括
#包括
#包括
#包括
使用名称空间std;
typedef struct tag_vpos{int data;list::iterator pos;}vpos;
列表行[100];
堆栈保存[100];
整数列[100][100],n,r,行大小[100];
//国际行[100][100];
长碳纳米管;
无效arr(整数x,整数y){
列表::迭代器it=行[y]。开始();
while(it!=行[y].end()){
if(!col[x][*it]){
vpos t={*it,it},temp;
int val=*it;
col[x][val]=1;
行[y]。擦除(it++);
保存[y]。推送(t);
如果(x==r-1){//如果第x列是右端
如果(y==r-1)cnt++;//如果第y列是底部,则将其计数
else-arr(0,y+1);//else填充下一行,第一列
}
else{arr(x+1,y);}//else填充右下一个正方形
temp=保存[y]。顶部();
行[y]。插入(临时位置、临时数据);
保存[y].pop();
列[x][温度数据]=0;
}
否则它++;
}
返回;
}
void main(){
printf(“输入n,r(用n种颜色绘制r x r字段,不能在同一列和行中使用相同的颜色)\n:”;
scanf(“%d%d”,&n,&r);
对于(int i=0;i}
要在迭代时从STL容器中删除元素,请将容器的函数(它们都有)与算法相结合。否则,您将使自己下面的迭代器无效

void delete_elements(std::list &list) 
{ 
    list.erase(
        std::remove_if(
            list.begin(),
            list.end(), 
            [](char x){return std::isspace(x);}),
        list.end() );
}

行[y]。擦除(it++)
是未定义的行为。从返回的迭代器是出于您似乎需要的原因提供的。可能
it=row[y]。擦除(it)?顾名思义,迭代器用于迭代。函数的作用是:从容器中删除所需的元素,并返回一个指向下一个有效元素(如果有的话)的迭代器。因此,当从迭代器中删除元素时,不需要在擦除之后增加迭代器,因为擦除的返回值将是指向有效元素(如果有)的迭代器。如果不存在元素,它将返回Container.end().row[y]。如果(*它),则删除_;尝试了行[y]。插入(临时位置、临时数据);对于这种情况,有一个成员函数要简单得多。