从矢量中删除满足条件的元素

Deleting elements from a vector that meet a condition

本文关键字:条件 元素 满足 删除      更新时间:2023-10-16

我正在尝试对埃拉托色尼筛进行编程,但我不确定如何在给定特定条件下从我制作的向量中删除元素。有谁知道如何实现这一目标?这是我的代码:

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

你的算法是错误的:

t = i % (i + 1); 

i

它总是 != 0,因为 i 大于 1。顺便说一下,如果你绝对想删除第t个元素,你必须确保向量不为空,然后你这样做:

primes.erase(primes.begin()+t);

即使你修复了算法,你的方法也是低效的:擦除矢量中间的元素意味着将擦除元素后面的所有元素复制回一个位置。

您通常不想删除埃拉托色尼筛子中间的元素,但是当您确实想要删除时,您通常希望使用删除/擦除习惯用法:

x.erase(std::remove_if(x.begin(), x.end(), condition), x.end());

std::remove基本上只是将集合划分为不满足指定条件的对象,然后是可能已用作副本或移动源的对象,因此您不能指望它们的值,但它们处于某种稳定状态,因此擦除它们将正常工作。

condition可以是函数或函子。它接收(对常量)对象,它检查并确定它是生是死(可以这么说)。

在这里找到一个用于筛子算法的 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);
}