通过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。
我绝对相信我的代码的其他部分是正确的,这是造成问题的部分。
答案 0 :(得分:2)
if (xj < 0)
{
xj = n + xj;
}
不保证此后xj
将是非负面的。我建议将其改为:
while (xj < 0)
{
xj = n + xj;
}
也可以使用更简单的表达式(感谢@StoryTeller):
if (xj < 0)
{
xj = n + (xj % n);
}