for(it1=prime.begin();it1<prime.end();it1++){
for(it2=it1+1;it2<prime.end();it2++){
if(*it2%*it1==0){
prime.erase(it2);
}
}
if(*it1<1000)
prime.erase(it1);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,我删除的数字是素数向量2中已存在的数字的倍数到9999(Eratosthenes的筛子).另外我只有1000以上的数字,但不知何故这些数字都没有被删除.
有人可以解释一下为什么?
提前致谢.
调用erase()使迭代器无效.您应该使用返回值,它是删除元素之后的值的迭代器,例如
it2 = prime.erase(it2);
Run Code Online (Sandbox Code Playgroud)
但是如果你做了这个改变(你必须这么做!),你需要++it2从for循环中删除.您还需要进行两项更改it1.这是一些未经测试的代码:
for (it1 = prime.begin(); it1 < prime.end();) {
for(it2 = it1 + 1; it2 < prime.end();) {
if (*it2 % *it1 == 0)
it2 = prime.erase(it2);
else
++it2;
}
if (*it1 < 1000)
it1 = prime.erase(it1);
else
++it1;
}
Run Code Online (Sandbox Code Playgroud)
请注意,擦除it2会不会失效it1,因为它严格地发生之前 it2因it2 = it1 + 1.所以你不需要关心这种干扰.
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |