通過std :: vector :: erase()方法的文檔,它指出該方法不會拋出任何異常,除非索引傳遞給它一個無效的索引。我有下面的代碼片段在我的C++程序:由std :: vector :: erase()引發的異常
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()。但問題是,當它在服務器上的外部數據上運行時,我會遇到分段錯誤。我找不到錯在哪裏。
---編輯--- 我用@ StoryTeller的答案替換了否定的索引檢查。 但是當我嘗試運行three test cases上的服務器上的程序時,我仍然遇到分段錯誤。 當我更換:
nl.erase(nl.begin() + xj);
用,
nl[xj] = -1;
,後來換-1做了檢查後,然後我沒有得到任何分段錯誤,但得到two wrong answers。
我絕對相信我的代碼的其他部分是正確的,這是導致問題的部分。
您需要發佈[MCVE。 – melpomene
如果'xj'小於'-n',那麼'xj = n + xj'將保持小於零。 – WhozCraig
我已經更新了片段 – Jagreet