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);
}
在上面的代码片段中,我删除了素数向量 2 到 9999(埃拉托色尼筛)中已经存在的数字的倍数。我也只删除了大于 1000 的数字,但不知何故,这些数字没有被删除。
有人可以解释一下为什么吗?
提前致谢。
Calling erase()
使迭代器无效。您应该使用返回值,它是被删除元素后面的值的迭代器,例如
it2 = prime.erase(it2);
但如果您进行此更改(您必须这样做!),您需要删除++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;
}
注意擦除it2
will not无效it1
,因为它严格发生before it2
因为it2 = it1 + 1
。所以你不需要担心这种干扰。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)