c++ - 如何按索引删除 vector 中每 2 个元素的倍数

标签 c++ vector erase

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

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);

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

// 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);

最佳答案

当你删除第二个元素时,下一个元素的迭代器减 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++;
    }

关于c++ - 如何按索引删除 vector 中每 2 个元素的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56745090/

相关文章:

c++ - Qt widget 背景从 Linux 到 Windows 不同

arrays - 在 MATLAB 中将数组转换为字符串?

c++ - 在 C++ 中使用数组或 std::vectors,性能差距是什么?

c++ - C++ string erase return *this 是什么意思?

c++ - 如何将 vector 的后半部分移动到另一个 vector 中?

c++ - 如何链接 netbeans (linux) 中的库?

c++ - fopen 在 C++ 中使用 char * 出错

c++ - 从资源加载 png 文件(无需 MFC、ATL)

c++ - 在 vector 中推送结构会覆盖时间分量

c++ - vector::erase 不会删除所需的元素,而是删除 vector 中的最后一个元素