我遇到了分段错误的问题,而我想从矢量容器中删除元素,这是最新推出的元素。
vector<client> :: iterator it;
for(it=ktab->begin(); it!=ktab->end(); ){
if(it->KEY_w==key_w) ktab->erase( it );
++it;
}
如何解决这个问题?
答案 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
也会返回一个有效的迭代器,该迭代器在您刚删除的项之后引用该项。在迭代器中存储此返回值可确保循环中的迭代器保持有效。