当我尝试在循环内使用vector.erase()
作为2D矢量时,我会遇到分段错误。这是代码:
vector<vector<int> > fault;
...
...
for(i=0; i<10; i++)
{
for(j=0; j<fault.size(); j++)
{
if(pointer[i].val == fault[j][0])
fault.erase(fault.begin() + j); //ERROR HERE!
}
}
是否因为矢量故障的大小发生了变化?我可以在这里使用擦除删除习语吗?如果是这样,我该怎么做?
非常感谢你!
答案 0 :(得分:0)
代码不能在您提到的行上导致分段错误。
可能是if语句导致分段错误。因为pointer
不包含10个有效元素,或者因为fault
在其包含的所有向量中没有元素0(零)。
您可以尝试添加此项检查:
for(i=0; i<10; i++)
{
for(j=0; j<fault.size(); j++)
{
if (fault[j].size() > 0)
{
if(pointer[i].val == fault[j][0])
fault.erase(fault.begin() + j);
}
}
}
顺便说一下,你的逻辑似乎是错误的,因为你没有测试向量中的所有元素,即当你擦除一个元素时,将跳过下一个元素的测试。也许你会需要这个:
for(i=0; i<10; i++)
{
for(j=0; j<fault.size(); )
{
if((fault[j].size()>0) && (pointer[i].val == fault[j][0]))
{
fault.erase(fault.begin() + j);
}
else
{
// Only increment when no erase is done
j++;
}
}
}