【问题标题】:Erasing many vector elements while going through it with 'auto'使用 'auto' 擦除许多矢量元素
【发布时间】:2020-05-10 08:37:38
【问题描述】:

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

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

【讨论】:

【解决方案2】:

我更喜欢这样的:

  pair<int, int> pair = nullptr;
  auto iter = vec.begin();
    while(iter != vec.end()){
        pair = (*iter);
        if(pair.first == pair.second){
            iter = this->vec.erase(iter);
        }else{
            ++iter;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多