C++ 在使用';自动';

C++ 在使用';自动';,c++,vector,auto,erase,C++,Vector,Auto,Erase,假设我有向量对,其中每个对对应于我正在处理的特定矩阵的索引(行和列) using namespace std; vector<pair<int, int>> vec; 但它不起作用,因为我认为vec.erase()应该有一个迭代器作为参数,x实际上是一个对,它是vectorvec的一个元素,而不是迭代器。我试着用几种方法修改它,但我不确定如何使用auto遍历容器元素,以及如何解决这个问题 在使用auto浏览时,我是否可以轻松地修改上面的代码以使其正常工作并擦除向量的多个

假设我有
向量
对,其中每个
对应于我正在处理的特定矩阵的索引(行和列)

using namespace std;
vector<pair<int, int>> vec;
但它不起作用,因为我认为
vec.erase()
应该有一个迭代器作为参数,
x
实际上是一个
,它是vector
vec
的一个元素,而不是迭代器。我试着用几种方法修改它,但我不确定如何使用
auto
遍历容器元素,以及如何解决这个问题

在使用
auto
浏览时,我是否可以轻松地修改上面的代码以使其正常工作并擦除向量的多个元素?或者我应该修改我的方法

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

vector::erase()
会使任何优秀的迭代器失效,包括基于范围的For循环正在使用的迭代器。使用
std::remove_if()

vec.erase(
std::如果需要,请删除(
vec.begin(),
vec.end(),
[](常量对&xx){返回xx.first==xx.second;}
),vec.end()
);
std::remove\u if()
将元素交换到向量的末尾,然后您可以安全地擦除它们。

vector::erase()
使任何未完成的迭代器无效,包括您基于范围的for循环正在使用的迭代器。使用
std::remove_if()

vec.erase(
std::如果需要,请删除(
vec.begin(),
vec.end(),
[](常量对&xx){返回xx.first==xx.second;}
),vec.end()
);

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

我更喜欢这样:

  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;
        }
    }
pair-pair=nullptr;
自动iter=vec.begin();
while(iter!=vec.end()){
配对=(*iter);
if(pair.first==pair.second){
iter=本->矢量擦除(iter);
}否则{
++iter;
}
}

我更喜欢这样的东西:

  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;
        }
    }
pair-pair=nullptr;
自动iter=vec.begin();
while(iter!=vec.end()){
配对=(*iter);
if(pair.first==pair.second){
iter=本->矢量擦除(iter);
}否则{
++iter;
}
}

确认您的假设:确认您的假设:是的,错过了它,修复了。std::erase_if(vec,[](对xx){return xx.first==xx.second;});是在C++20中@MooingDuck如果他能使用c++20Yup,则修复了它,修复了.std::erase_If(vec,[](pair xx){return xx.first==xx.second;});是在C++20中@如果他能用c++20,他就要发牢骚
  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;
        }
    }