两个元素个数相同的容器 vector<string> delete_pathlists; vector<unsigned char> crosstypelists;想要移除crosstypelists中等于2的元素,同时移除delete_pathlists中相同位置的元素
时间: 2024-03-02 16:51:26 浏览: 51
可以使用 erase-remove idiom 来实现:
```
crosstypelists.erase(std::remove(crosstypelists.begin(), crosstypelists.end(), 2), crosstypelists.end());
delete_pathlists.erase(std::remove_if(delete_pathlists.begin(), delete_pathlists.end(),
[&, i = 0](const auto&) mutable { return crosstypelists.size() > i && crosstypelists[i++] == 2; }),
delete_pathlists.end());
```
这里使用了 lambda 表达式来捕获 `crosstypelists` 和 `&` 以传递引用。`i` 是一个可变的局部变量,用于跟踪 `crosstypelists` 的迭代器。`remove_if` 通过调用 lambda 表达式来判断是否需要移除对应位置的元素,如果需要,就将其移除。
需要注意的是,`erase` 和 `remove_if` 的顺序不能颠倒,否则会导致迭代器失效。
相关问题
两个元素个数相同的容器 vector<string> delete_pathlists; vector<unsigned char> crosstypelists;执行下面操作:移除delete_pathlists中所有等于string thepath_str的元素,移除crosstypelists中delete_pathlists删除元素对应位置的元素
好的,我理解了你的问题。对于第一个问题,你可以使用 erase-remove idiom 来删除 vector 中所有等于特定值的元素。具体来说,可以使用以下代码:
```
delete_pathlists.erase(std::remove(delete_pathlists.begin(), delete_pathlists.end(), "thepath_str"), delete_pathlists.end());
```
对于第二个问题,可以考虑使用一个 vector 的迭代器,通过迭代器来删除对应位置的元素。具体来说,可以使用以下代码:
```
auto delete_it = delete_pathlists.begin();
auto crosstype_it = crosstypelists.begin();
while (delete_it != delete_pathlists.end()) {
if (*delete_it == "thepath_str") {
delete_it = delete_pathlists.erase(delete_it);
crosstype_it = crosstypelists.erase(crosstype_it);
} else {
++delete_it;
++crosstype_it;
}
}
```
这段代码会遍历 delete_pathlists 中的所有元素,如果当前元素等于 "thepath_str",就将其从 delete_pathlists 和 crosstypelists 中删除,并将对应的迭代器也更新。如果当前元素不等于 "thepath_str",就将两个迭代器都向前移动一位,继续检查下一个元素。
阅读全文