c++ - 删除两个向量C++中的相似元素
问题描述
我正在尝试在两个向量(每个向量的任何大小)中搜索相同的元素,然后删除这两个元素。
我的实现如下:
for (int i = vec1.size() - 1; i >= 0; i--) {
for (int j = 0; j < vec2.size(); j++) {
if (vec1[i] == vec2[j]) {
vec1.erase(vec1.begin() + i);
vec2.erase(vec2.begin() + j);
}
}
}
然而,虽然这适用于大多数情况,但我遇到了一些不适用的情况。是我迭代这些向量的方式,还是我只是把这一切都错了?
解决方案
您实际上根本不需要向后迭代。在这种情况下,您的代码可以是:
for (int i = 0; i < vec1.size(); i++) {
for (int j = 0; j < vec2.size(); j++) {
if (vec1[i] == vec2[j]) {
vec1.erase(vec1.begin() + i);
vec2.erase(vec2.begin() + j);
}
}
}
但是等一下……我们删除一个元素后会发生什么?然后它之后的所有元素的索引都减1,所以我们将跳过下一项!为了解决这个问题,我们可以添加这个小修改:
vec1.erase(vec1.begin() + i--);
vec2.erase(vec2.begin() + j--);
^^^^
即使我们通过擦除来改变大小,这也会起作用,因为我们正在检查vec2
每个循环的大小!但是如果我们最终删除了 的最后一项vec1
呢?在我们一直迭代之前,我们不会再次比较它的大小,这在您的示例vec2
中将是一个问题。vec1 = {2}, vec2 = {2, 2, 2}
为了解决这个问题,我们可以跳出内部循环并重复检查vec2
.
将它们放在一起(并将您的下标运算符更改为.at()
调用,以便我们进行边界检查),您将获得:
for (int i = 0; i < vec1.size(); i++) {
for (int j = 0; j < vec2.size(); j++) {
if (vec1.at(i) == vec2.at(j)) {
vec1.erase(vec1.begin() + i--);
vec2.erase(vec2.begin() + j--);
break;
}
}
}
(在这里查看实际操作:ideone)
推荐阅读
- python - 转换在列表中随机分布的某些数字,同时保留其他数字
- sql-server - SQL Server:从代码中的引用实体过程中获取消息
- python - Dask read_csv——在`pd.read_csv`/`pd.read_table`中发现不匹配的dtypes
- wordpress - 在 gform_pre_send_email 函数中提交表单后获取 Gravity 表单条目 ID
- r - window() 函数排除作为结束参数发送的日期,有什么解决方法吗?
- git - Git:如何在没有多个冲突解决的情况下重新设置 Squash
- python - 按主题分组并将一列字符串折叠到相应的类别中
- angular - 根据 Angular 5,6 中的路由路径隐藏元素
- oracle - 在 oracle 触发器中获取会话操作系统用户
- regex - 正则表达式匹配确切的单词,忽略包含它作为子字符串的单词?