首页 > 解决方案 > 如何按索引删除向量中2个元素的每个倍数

问题描述

我正在尝试从 C++ 中的整数向量中删除每个第二个元素

int n = 10001;    
std::vector<int> sieve;    

for (int i = 2; i <= n; ++i)
    sieve.push_back(i);


for (int i = 2; i < sieve.size(); i += 2)
    sieve.erase(sieve.begin() + i);

我想从向量中删除每个第二个元素(这将是 2 的倍数,范围为 2-10001)。输出是这样的:

// index, value
0 2
1 3
2 5
3 6
4 8
5 9
6 11
7 12
8 14
9 15
10 17
....

因此,它按预期删除了 4、10 和 16。但是仍然有许多 2 的倍数,即 6、8、12、14

编辑使用在评论中发布的@Retired Ninja 方法解决。(反过来做)

for (int i = 2; i <= n; i++)
    sieve.push_back(i);

for (int i = sieve.size(); i >= p; i -= p)
    sieve.erase(sieve.end() - i);

标签: c++vectorerase

解决方案


当您擦除第二个元素时,下一个元素的迭代器会减少 1。因此增加 1 次循环变量是可以的。

int n = 100;    
std::vector<int> sieve;    

for (int i = 2; i <= n; ++i)
    sieve.push_back(i);


for (int i = 2; i < sieve.size(); i += 1)
    sieve.erase(sieve.begin() + i);

在擦除 pth 元素的情况下还有另一种方法:

    int cnt=0;
    int l=sieve.size();
    for (int i = 2; i < l; i += p){
        sieve.erase(sieve.begin() + (i-cnt));
            cnt++;
    }

推荐阅读