当我正在创建一个简单的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,但我不知道如何在单个循环中实现擦除或更改元素的值。当我使用迭代器擦除一个元素时,就像在erase set element while iterating///中一样,我不能访问向量来改变它的值,当我使用一个标准的for循环来访问元素时,我不能删除它。我试着从向量的末尾开始,计算非零元素,并在擦除时给出一些偏移量,但没有成功。TL DR:我搞不懂的是:
for(int i = 0; i < N; i++)
{
if(result[i] == 0) {
//remove at position i
} else {
result.at(i) = i;
}
}
提前感谢您的宝贵时间:)
发布于 2021-01-12 17:58:23
不是删除向量中间的元素,而是从向量的开头开始写入结果,并删除向量末尾的未使用的元素。
int finalSize = 0;
for(int i = 0; i < N; i++)
{
if(result[i] != 0) {
result[finalSize++] = i;
}
}
result.resize(finalSize);
发布于 2021-01-12 17:59:04
如果在遍历过程中仍然需要从std::vector
中删除元素,请记住erase
会在最后删除的元素后面返回一个迭代器:
std::vector<int> result = {1,1,1,0,1,1,1};
for(auto it = result.begin(); it != result.end(); )
{
if(*it==0)
it = result.erase(it);
else
it++;
}
https://stackoverflow.com/questions/65689253
复制相似问题