如何使用delete()函数通过索引擦除向量?

时间:2019-11-22 21:27:23

标签: c++ vector

要正常遍历向量数组,我使用索引(请参见代码)而不是迭代器。今天,我试图通过索引擦除矢量元素。我已经尝试了几次和几种方法,但是每次(在编译器中)最后一行似乎都出现错误。 请帮助我修复代码以通过索引擦除元素。预先感谢。

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);

2 个答案:

答案 0 :(得分:5)

您可以使用

<li class="nav-item">
          <a routerLink="/login" class="nav-link">{{ userLoggedIn }} </a>
      </li>

但使用起来会更惯用:

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

最好还是使用erase-remove idiom

for ( auto iter = p.begin(); iter != p.end(); )
{
    if( iter->first == 1 )
    {
        iter = p.erase(iter);
    }
    else
    {
       ++iter;
    }
}

答案 1 :(得分:3)

让代码正常工作并不是很简单,因为在删除元素时,用i进行的索引编制会被破坏-仅在不删除元素的情况下才需要增加i

for(int i = 0; i != p.size(); )
    if(p[i].first == 1)
        p.erase(p.begin() + i);
    else
       i++;

但是您最好使用erase-remove惯用语,因为它不易出错且效率更高(在向量中间进行擦除非常昂贵):

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

std::remove_if()