假设我有 vector
对,其中每个 pair
对应于我正在处理的某个矩阵的索引(行和列)
using namespace std;
vector<pair<int, int>> vec;
我想用
auto
,遍历整个 vector 并立即删除所有满足某些条件的对,例如for (auto& x : vec) {
if (x.first == x.second) {
vec.erase(x);
}
}
但它不起作用,我想
vec.erase()
应该有一个迭代器作为参数和x
实际上是一个pair
那是 vector vec
的一个元素,而不是迭代器。我尝试以几种方式对其进行修改,但我不确定如何使用 auto
处理容器元素完全有效,我该如何解决这个问题。我可以轻松修改上面的代码以使其正常工作并删除 vector 的多个元素,同时使用
auto
?或者我应该修改我的方法?现在它只是一个对的 vector ,但以后会更糟,所以我想使用
auto
为简单起见。
最佳答案
vector::erase()
使任何未完成的迭代器无效,包括基于范围的 for 循环正在使用的迭代器。使用std::remove_if()
:
vec.erase(
std::remove_if(
vec.begin(),
vec.end(),
[](const pair<int,int> &xx) { return xx.first == xx.second; }
), vec.end()
);
std::remove_if()
将元素交换到 vector 的末尾,然后您可以安全地删除它们。
关于c++ - 使用 'auto' 删除许多 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889304/