首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在C++中遍历向量时擦除或更改元素?

如何在C++中遍历向量时擦除或更改元素?
EN

Stack Overflow用户
提问于 2021-01-12 17:48:59
回答 2查看 136关注 0票数 0

当我正在创建一个简单的Erathostenes函数筛子时,我偶然发现了一个障碍。为了在这项任务中实现最高的效率,我只想使用一个向量。下面是当前的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:我搞不懂的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(int i = 0; i < N; i++)
{
        if(result[i] == 0) {
                //remove at position i
        } else {
                result.at(i) = i;
        }
}

提前感谢您的宝贵时间:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-12 17:58:23

不是删除向量中间的元素,而是从向量的开头开始写入结果,并删除向量末尾的未使用的元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int finalSize = 0;
for(int i = 0; i < N; i++)
{
        if(result[i] != 0) {
                result[finalSize++] = i;
        }
}
result.resize(finalSize);
票数 1
EN

Stack Overflow用户

发布于 2021-01-12 17:59:04

如果在遍历过程中仍然需要从std::vector中删除元素,请记住erase会在最后删除的元素后面返回一个迭代器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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++;
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65689253

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文