首页 > 解决方案 > 在 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;
        }
}

提前感谢您的时间:)

标签: c++stl

解决方案


与其擦除向量中间的元素,不如从向量的开头写入结果,并消除向量末尾未使用的元素。

int finalSize = 0;
for(int i = 0; i < N; i++)
{
        if(result[i] != 0) {
                result[finalSize++] = i;
        }
}
result.resize(finalSize);

推荐阅读