使用“自动”遍历时擦除许多向量元素

Kus*_*vil 1 c++ vector erase auto

假设我有vector成对,其中每个pair对应于我正在处理的某个矩阵的索引(行和列)

using namespace std;
vector<pair<int, int>> vec;
Run Code Online (Sandbox Code Playgroud)

我想使用auto遍历整个向量并立即删除满足某些条件的所有对,例如

for (auto& x : vec) {
    if (x.first == x.second) {
        vec.erase(x); 
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为我想vec.erase()应该有一个迭代器作为参数,x实际上pair是一个 vector 元素vec,而不是迭代器。我尝试以几种方式对其进行修改,但我不确定如何auto准确地处理容器元素以及如何解决此问题。

我可以轻松修改上面的代码以使其工作并擦除 vector 的多个元素,同时使用auto? 或者我应该修改我的方法?

现在它只是一个成对的向量,但以后会更糟,所以auto为了简单起见,我想使用它。

gct*_*gct 5

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()
);
Run Code Online (Sandbox Code Playgroud)

std::remove_if() 将元素交换到向量的末尾,然后您可以安全地擦除它们。

  • std::erase_if(vec, [](pair&lt;int,int&gt; xx) { return xx.first == xx.second; }); https://en.cppreference.com/w/cpp/container/vector/erase2 采用 C++20 语言! (2认同)