首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vector::erase()未按预期工作

vector::erase()未按预期工作
EN

Stack Overflow用户
提问于 2010-12-26 03:12:10
回答 2查看 927关注 0票数 2
代码语言:javascript
复制
  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筛子)中已经存在的数的倍数,.also i只删除了大于1000的数,但不知何故,这些数没有被删除。

有人能给我解释一下为什么吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-26 03:17:45

调用erase()会使迭代器失效。您应该使用返回值,它是被删除元素后的值的迭代器,例如

代码语言:javascript
复制
it2 = prime.erase(it2);

但是,如果您进行了此更改(您必须这样做!),则需要从for循环中删除++it2。您还需要对it1进行这两项更改。以下是一些未经测试的代码:

代码语言:javascript
复制
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 = it1 + 1,它严格在it2之前发生。所以你不需要担心这种干扰。

票数 6
EN

Stack Overflow用户

发布于 2010-12-26 03:18:05

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4531330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档