从矢量中删除满足条件的元素
Deleting elements from a vector that meet a condition
我正在尝试对埃拉托色尼筛进行编程,但我不确定如何在给定特定条件下从我制作的向量中删除元素。有谁知道如何实现这一目标?这是我的代码:
#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);
}
相关文章:
- 基于多个条件处理地图中的所有元素
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 如何有条件地将元素添加到 std::array - C++11
- 我可以在一行代码中将向量中与条件匹配的所有元素插入到集合中吗?
- 在矢量中使用特定条件检查唯一元素
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- AVX2 根据条件将连续元素扩展到稀疏向量?(如AVX512 VP扩展)
- 检查是否所有 std::元组元素都满足条件 + 设计问题
- 在C++中有条件地删除Singly Linked List中的元素
- 在c++中找到满足给定条件的向量的元素的位置
- 传入一个迭代器,该迭代器只迭代满足特定条件的元素
- X宏中元素的条件定义
- 根据条件将元素从 std::vector 复制到 std::set 但它崩溃了
- 根据条件将元素从一个forward_list转移到另一个
- 如何根据另一个向量中的条件从另一个向量中删除元素
- OpenCV 从矩阵中获取条件基最大元素位置
- 如何根据c++11中的特定条件从向量中擦除元素
- 从向量中移除最后的元素,直到条件
- 基于条件语句删除循环中的矢量元素
- 找到满足条件的第n个元素