c++ - 使用 'auto' 删除许多 vector 元素

标签 c++ vector auto erase

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

相关文章:

c++ - lambda 闭包中的模板

python - 将向量查找字符串转换为向量值 [python]

c++ 父类对象的集合

c++ - 如何使用基于范围的for循环迭代器?

C++ vector 插入和迭代器混淆

c++ - 无法将 C++ 项目与 openssl 静态库链接

c++ - 如何在同一列表中存储指向任意类类型的方法指针?

c++ - 如何从基类 vector 到达派生类变量?

c++ - "auto"在 C++17 中的整数溢出是否安全?

c++ - `auto pp` 和 `auto *ppp` 有什么区别?