2017-05-12 31 views
0

通過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

我絕對相信我的代碼的其他部分是正確的,這是導致問題的部分。

+5

您需要發佈[MCVE。 – melpomene

+0

如果'xj'小於'-n',那麼'xj = n + xj'將保持小於零。 – WhozCraig

+0

我已經更新了片段 – Jagreet

回答

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

並不保證xj在此之後將是非負的。我建議將其更改爲:

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

一個更簡單的表達也可以使用(感謝@StoryTeller):

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

如果xj <0且abs(xj)> n,則此循環將永不終止。 –

+0

@RichardCritten - 它會https://ideone.com/SeLmps – StoryTeller

+1

謝謝,@StoryTeller。 –