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(Eratosthenes的筛子).另外我只有1000以上的数字,但不知何故这些数字都没有被删除.
有人可以解释一下为什么?
提前致谢.
解决方法
调用erase()会使迭代器无效.您应该使用返回值,它是删除元素之后的值的迭代器,例如
it2 = prime.erase(it2);
但是如果你做了这个改变(你必须这么做!),你需要从for循环中删除它.您还需要为它进行两项更改.这是一些未经测试的代码:
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不会使it1无效,因为它严格地发生在it2之前,因为it2 = it1 1.所以你不必担心这种干扰.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。