gpt4 book ai didi

c++ - vector::erase() 没有按预期工作

转载 作者:太空狗 更新时间:2023-10-29 20:18:18 26 4
gpt4 key购买 nike

  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);
}

在上面的代码片段中,我删除了素数 vector 2 到 9999(Eratosthenes 筛法)中已经存在的数字的倍数。此外,我只删除了大于 1000 的数字,但不知何故这些数字没有被删除。

谁能解释一下为什么?

提前致谢。

最佳答案

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

it2 = prime.erase(it2);

但是如果您进行此更改(您必须这样做!),则需要从 for 循环中删除 ++it2。您还需要对 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。所以您不必担心这种干扰。

关于c++ - vector::erase() 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4531330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com