std :: vector :: erase()引发异常

时间:2017-05-12 07:08:33

标签: c++ exception vector

通过std :: vector :: erase()方法的文档,它声明该方法不会抛出任何异常,除非传递给它的索引是无效索引。我的C ++程序中有以下代码段:

vector<int> remove_element(vector<int> v,int xj,int n)
{
    std::vector<int> nl(v);

    if (xj < 0)
    {
        xj = n + xj;
    }
    if(xj>=n)
    {
        xj = xj%n;
    }
    nl.erase(nl.begin() + xj);//This line is causing a segmentation fault

   return nl;
}

v是程序中的预定义向量,n是其大小,nl使用复制构造函数制作该向量的副本,以便不反映nl到v中所做的更改.xj是要擦除的索引从矢量。我还包含了if语句,以确保无法将无效索引传递给erase()。但问题是,当它在服务器上的外部数据上运行时,我会遇到分段错误。我无法找到它出错的地方。

--- --- EDITED 我用@ StoryTeller的答案替换了负面索引检查。 但是当我尝试在three test cases上运行服务器上的程序时,我仍然遇到分段错误。 当我替换:

nl.erase(nl.begin() + xj);

用,

nl[xj] = -1;

稍后再检查-1,然后我没有得到任何Segmentation错误但得到two wrong answers

我绝对相信我的代码的其他部分是正确的,这是造成问题的部分。

1 个答案:

答案 0 :(得分:2)

if (xj < 0)
{
   xj = n + xj;
}

不保证此后xj将是非负面的。我建议将其改为:

while (xj < 0)
{
   xj = n + xj;
}

也可以使用更简单的表达式(感谢@StoryTeller):

if (xj < 0)
{
   xj = n + (xj % n);
}
相关问题