2015-11-05 83 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