使用擦除 - 删除习惯用于2D或3D向量

时间:2015-11-27 05:46:07

标签: c++ vector segmentation-fault

当我尝试在循环内使用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!
    }
}

是否因为矢量故障的大小发生了变化?我可以在这里使用擦除删除习语吗?如果是这样,我该怎么做?

非常感谢你!

1 个答案:

答案 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++;
        }
    }
}