2015-11-05 60 views
0

在這裏,我有一個包含它認爲列表的載體是質數,然而,一些後來的價值是由較早出現在列表中的一些值divisiable。矢量擦除通過迭代器位置

爲了修正這個問題,我嘗試迭代我的向量v,並刪除該值,如果它可以在向量中被另一個除以餘數。

不過,我不斷收到此錯誤(「不匹配的成員函數調用擦除」)和想不出任何其他方式,通過這種循環刪除在我的迭代點的值。有什麼建議麼?

for (vector<int>::iterator it2 = v.begin();it2 != v.end(); ++it2){ 
    for (vector<int>::iterator it3 = v.begin();it3 != v.end(); ++it3){ 
     if (*it3%*it2 == 0){ 
      v.erase (*it2); 
     } 
    } 
} 
+1

'矢量:: erase'無效迭代器...... – Jarod42

+0

和'v.front()% v.front()== 0',所以你最終會得到一個空向量。 – Jarod42

+0

'v.erase(it2);'? –

回答

0

vector::erase需要一個迭代。因此,你需要:

v.erase(it2); 

除此之外,vector::erase在或擦除點後無效迭代器和引用,包括end()迭代器,所以你需要更新你的迭代器:

if (*it3 % *it2 == 0) { 
    auto it3index = it3 - v.begin(); 
    it2 = v.erase(it2); 
    it3 = v.begin() + it3index; 
} 

或者你可以使整個事情變得簡單許多,不使用迭代器:

for (unsigned i = 0; i < v.size(); ++i) { 
    for (unsigned j = 0; j < v.size(); ++j) { 
     if (v.at(j) % v.at(i) == 0) { 
      v.erase(v.begin() + i); 
     } 
    } 
} 
+0

你是什麼意思處理它3? – 17DOWN

+0

更新它,因爲'erase'可能會使其無效。 – emlai

+0

我目前正在嘗試使用您添加的'for'循環。它正在工作,但沒有完全給出我需要的結果。我想我可以使用,有位雖然調整的!由於 – 17DOWN