擦除矢量容器的最后一个元素

时间:2014-01-10 23:01:21

标签: c++ vector erase

我遇到了分段错误的问题,而我想从矢量容器中删除元素,这是最新推出的元素。

vector<client> :: iterator it;

for(it=ktab->begin(); it!=ktab->end(); ){
    if(it->KEY_w==key_w) ktab->erase( it );
    ++it;
}

如何解决这个问题?

4 个答案:

答案 0 :(得分:6)

ktab->erase(it)您显然会使it无效。在紧接其后的语句中,您将增加已经无效的it。你可能想要使用

的内容
ktab->erase(std::remove_if(ktab->begin(), ktab->end(),
                           [=](client const& c){ return c.KEY_w == key_w; }),
            ktab->end());

请注意,使用std::remove_if()的解决方案最多移动一次元素。其他解决方案可能有二次移动。

答案 1 :(得分:2)

vector<client> :: iterator it;

for(it=ktab->begin(); it!=ktab->end(); ){
    if(it->KEY_w==key_w) it = ktab->erase( it );
    else  ++it;
}

虽然在这种情况下最好使用标准算法std :: remove_it

来使用成员函数擦除

答案 2 :(得分:1)

通过迭代器删除元素时,迭代器变为无效。这就是erase返回已删除元素后的第一个迭代器的原因。您可以像这样修复代码:

for(it=ktab->begin(); it!=ktab->end(); ){
    if(it->KEY_w==key_w) {
        it = ktab->erase( it );
    } else {
        ++it;
    }
}

答案 3 :(得分:0)

以这种方式试试

for(it=ktab->begin(); it!=ktab->end(); ){
    if(it->KEY_w==key_w) 
    {
       it = ktab->erase( it );
    }
    else
    {
       ++it;
    }
}

调用erase后,迭代器无效,但erase也会返回一个有效的迭代器,该迭代器在您刚删除的项之后引用该项。在迭代器中存储此返回值可确保循环中的迭代器保持有效。