首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过索引删除向量中2元素的每一个倍数

如何通过索引删除向量中2元素的每一个倍数
EN

Stack Overflow用户
提问于 2019-06-25 07:29:37
回答 2查看 1.4K关注 0票数 0

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

代码语言:javascript
复制
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的倍数,范围从2-10001)。输出是这样的:

代码语言:javascript
复制
// 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

编辑已解决的方法@退役忍者在评论中张贴。(反向操作)

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2019-06-25 07:58:08

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

代码语言:javascript
复制
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);

在擦除第p个元素的情况下的另一种方式:

代码语言:javascript
复制
    int cnt=0;
    int l=sieve.size();
    for (int i = 2; i < l; i += p){
        sieve.erase(sieve.begin() + (i-cnt));
            cnt++;
    }
票数 2
EN

Stack Overflow用户

发布于 2019-06-25 08:58:18

这个怎么样?这将从vec中删除从start开始的每个nth元素。

它是就地执行的,只涉及一次数组大小调整,并且每个未被擦除的元素只移动一次。

代码语言:javascript
复制
void remove(std::size_t nth, std::size_t start, std::vector<int> &vec)
{
    std::size_t step;
    for (step = 1; start < vec.size(); ++step, start += nth)
    {
        for (std::size_t i = 1; i < nth && start + i < vec.size(); ++i)
        {
            vec[start + i - step] = vec[start + i];
        }
    }
    vec.resize(vec.size() - (step - 1));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56745090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档