用'auto'删除它的许多矢量元素

问题描述 投票:1回答:1

假设我有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

c++ vector auto erase
1个回答
2
投票

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()交换元素到向量的结尾,然后您可以安全地擦除它们。

© www.soinside.com 2019 - 2024. All rights reserved.