对2D或3D矢量使用擦除-删除习惯用法

Using the erase-remove idiom for 2D or 3D vectors

本文关键字:擦除 删除 习惯 惯用法 2D 3D      更新时间:2023-10-16

当我尝试对循环内的2D向量使用vector.erase()时,我会遇到分割错误。这是代码:

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!
    }
}

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

非常感谢!

代码不会在您提到的行上导致分段错误。

可能是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++;
        }
    }
}