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