c++ - 在 C++ 中迭代向量时如何擦除或更改元素?
问题描述
当我偶然发现一个障碍时,我正在创建一个简单的 Erathostenes 函数筛子。为了完成这项任务的最高效率,我只想使用一个向量。这是当前代码:
vector<int> sieveOfErathostenes(int N) {
vector <int> result(N, 1);
for(int i = 2; i < sqrt(N); i++)
if(result[i] == 1)
for(int j = 2*i; j < N; j += i)
result.at(j) = 0;
// :c
return result;
}
该向量在正确的位置返回 1 和 0,但我无法弄清楚如何在单个循环中实现擦除或更改元素的值。当我在迭代时使用迭代器擦除元素时,就像在擦除集合元素中一样///我无法访问向量来更改其值,并且当我使用标准 for 循环访问元素时,我无法删除它。我尝试从向量的末尾开始计算非零元素并在擦除时给出一些偏移但没有成功。TL DR:我想不通的是:
for(int i = 0; i < N; i++)
{
if(result[i] == 0) {
//remove at position i
} else {
result.at(i) = i;
}
}
提前感谢您的时间:)
解决方案
与其擦除向量中间的元素,不如从向量的开头写入结果,并消除向量末尾未使用的元素。
int finalSize = 0;
for(int i = 0; i < N; i++)
{
if(result[i] != 0) {
result[finalSize++] = i;
}
}
result.resize(finalSize);
推荐阅读
- javascript - 是的验证模式同步与异步验证并显示一个字段的多个错误
- r - 在 r data.table 中查找重复组
- r - R中并行计算中的临时对象
- c++ - 如何在函数中使用二维数组?
- java - 如何获取 EditText 以检查它是否等于 Integer ArrayList 中的任何数字?
- unity3d - Unity - 转向冲刺
- database - 由于驱动程序无法连接到数据库
- python - 如何使用值对数据框进行排序
- python - 对象的描述符不适用于对象,使用 __slots__
- c++ - GitLab CI:如何构建然后缓存依赖项,然后在它们发生变化时再次构建它们?