假设我有vector
对,其中每个pair
对应于我正在处理的某些矩阵的索引(行和列)
using namespace std;
vector<pair<int, int>> vec;
[我想使用auto
遍历整个向量,并立即删除所有满足特定条件的对,例如
for (auto& x : vec) {
if (x.first == x.second) {
vec.erase(x);
}
}
但是它不起作用,因为我想vec.erase()
应该有一个迭代器作为参数,x
实际上是一个pair
,它是向量vec
的元素,而不是迭代器。我试图以几种方式对其进行修改,但是我不确定如何使用auto
遍历容器元素以及如何解决此问题。
我可以轻松地修改上面的代码,以使其工作并擦除矢量的多个元素,并通过auto
进行遍历吗?还是应该修改我的方法?
目前,它只是成对的向量,但是以后会更糟,所以为了简单起见,我想使用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()
交换元素到向量的结尾,然后您可以安全地擦除它们。