我正在尝试编写Eratosthenes的Sieve,但我不确定如何从给定特定条件的向量中删除元素。有谁知道如何实现这一目标?这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int prime(int n);
int prime(int n)
{
vector<int> primes;
for(int i = 2; i <= n; i++)
{
primes.push_back(i);
int t = i % (i + 1);
if(t == 0)
{
delete t; // is there a way of deleting the elements from
// the primes vector that follow this condition t?
}
cout << primes[i] << endl;
}
}
int main()
{
int n;
cout << "Enter a maximum numbers of primes you wish to find: " << endl;
cin >> n;
prime(n);
return 0;
}
答案 0 :(得分:1)
你通常不想删除Eratosthenes筛子中间的元素,但是当你想要的时候,你通常想要使用删除/擦除习语:
x.erase(std::remove_if(x.begin(), x.end(), condition), x.end());
std::remove
基本上只是将集合划分为那些不符合指定条件的集合,然后是可能被用作副本或移动源的对象,因此您可以&#39 ; t指望它们的值,但它们处于某种稳定的状态,因此擦除它们会很好。
condition
可以是函数或函子。它接收(对const的引用)对象,它检查并确定它是否存在(可以这么说)。
答案 1 :(得分:1)
你的算法错了:
t = i % (i + 1);
是
i
总是!= 0因为我大于1。 顺便说一下,如果你绝对想要删除第t个元素,你必须确保向量不是空的然后你做:
primes.erase(primes.begin()+t);
即使您修复算法,您的方法效率也很低:在向量中间删除元素意味着将所有已删除元素后面的位置复制回一个位置。
答案 2 :(得分:0)
在这里找到筛选算法的c ++伪代码。一旦你理解了算法,你就可以开始研究它了。
primes(vector& primes, size_t max){
vector primesFlag(1,max);
i=1
while(i*i<max){
++i;
for(j=i*i; j < max; j+= i){
primesFlag[j] = 0;
}
}
primes.clear()
primes.reserve(...);
for(j >= 2;
if primesFlag[j] = 1
primes.push_back(j);
}