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

ros*_*del 0 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);
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 5

您可以使用

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

Run Code Online (Sandbox Code Playgroud)

但使用起来会更惯用:

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

更好的是,使用擦除删除惯用语。

p.erase(std::remove_if(p.begin(), p.end(),
                       [](std::pair<int, std::pair<int, int>> const& item) { return item.first == 1;}),
        v.end());
Run Code Online (Sandbox Code Playgroud)