2
  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 的数字,但不知何故这些数字并没有被删除。

有人可以解释一下为什么吗?

提前致谢。

4

2 回答 2

6

调用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不会无效it1,因为它严格发生在之前 it2由于it2 = it1 + 1. 因此,您无需担心这种干扰。

于 2010-12-25T19:17:44.710 回答
0

如果要擦除项目和循环,则需要执行 'it1=prime.begin();' 擦除后再次。因为安排。

于 2010-12-25T19:18:05.200 回答