C++ 如何使用erase()函数通过索引删除向量?

C++ 如何使用erase()函数通过索引删除向量?,c++,vector,C++,Vector,为了正常遍历向量数组,我使用indexingsee代码,而不是使用迭代器。今天,我尝试通过索引删除向量元素。我已经尝试了好几次,好几种方法,但每次编译器的最后一行似乎都有错误。 请帮助我修复通过索引删除元素的代码。提前谢谢 vector<pair<int, pair<int, int> > > p; p.push_back(make_pair(1,make_pair(2,4))) ; p.push_back(make_pair(5,make_pair(6,7

为了正常遍历向量数组,我使用indexingsee代码,而不是使用迭代器。今天,我尝试通过索引删除向量元素。我已经尝试了好几次,好几种方法,但每次编译器的最后一行似乎都有错误。 请帮助我修复通过索引删除元素的代码。提前谢谢

vector<pair<int, pair<int, int> > > p;

p.push_back(make_pair(1,make_pair(2,4))) ;
p.push_back(make_pair(5,make_pair(6,7))) ;

for(int i = 0; i != p.size(); i++)
    if(p[i].first == 1)
        p.erase(i);
你可以用

for(int i = 0; i != p.size(); ) // Don't increment here.
{
    if(p[i].first == 1)
    {
        p.erase(p.begin() + i );
    }
    else
    {
       ++i;
    }
}

但它将更习惯于使用:

for ( auto iter = p.begin(); iter != p.end(); )
{
    if( iter->first == 1 )
    {
        iter = p.erase(iter);
    }
    else
    {
       ++iter;
    }
}
更好的方法是使用


当你们擦除元素的时候,你们的索引将被破坏——你们只需要在元素并没有被擦除的时候增加i,所以你们的代码并不能很快工作

for(int i = 0; i != p.size(); )
    if(p[i].first == 1)
        p.erase(p.begin() + i);
    else
       i++;
但您最好使用擦除-删除习惯用法,因为它不太容易出错,而且在向量中间执行更高效的擦除非常昂贵:

p.erase( std::remove_if( p.begin(), p.end(), []( const auto &pair ) { return pair.first == 1; } ), p.end() );

p.erase( std::remove_if( p.begin(), p.end(), []( const auto &pair ) { return pair.first == 1; } ), p.end() );