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