c++ - 如何按索引删除向量中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);
解决方案
当您擦除第二个元素时,下一个元素的迭代器会减少 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++;
}
推荐阅读
- ruby-on-rails - 通过 activerecord-import gem 从远程 URL 导入 ActiveStorage 图像
- php - DocuSign 的问题,从开发环境迁移到生产环境(上线)
- docker - 在 DockerFile 的 FROM 中指定 --build-args
- python-3.x - 无法随机化来自 reddit 的提交
- python - 尝试使用文本分类并接收错误代码
- google-console-developer - 使用什么角色能够推送到容器注册表
- vue.js - vue.config.js optimization.splitChunks 打破了新项目中的单元测试
- r - 通过引用更新存储在另一个 data.table 中的 data.table
- jquery - 如何折叠 bootstrap4 列表中的所有其他节点?
- scala - 使用类型安全库和 extraJavaOptions 合并 spark 的配置