加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – vector :: erase()未按预期工作

发布时间:2020-12-16 09:31:27 所属栏目:百科 来源:网络整理
导读:for(it1=prime.begin();it1prime.end();it1++){ for(it2=it1+1;it2prime.end();it2++){ if(*it2%*it1==0){ prime.erase(it2); } } if(*it11000) prime.erase(it1); } 在上面的代码片段中,我删除的数字是素数向量2中已存在的数字的倍数到9999(Eratosthenes的
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.所以你不必担心这种干扰.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读