3 回答
TA贡献1810条经验 获得超4个赞
res.erase(it) 始终返回下一个有效的迭代器,如果您删除最后一个元素,它将指向 .end()
在循环的末尾++it总是被调用,因此您.end()不允许递增。
简单地检查.end()仍然会留下一个错误,因为您总是在每次迭代中都跳过一个元素(it从的返回值“递增” .erase(),然后在循环中再次递增)
您可能想要类似的东西:
while (it != res.end()) {
it = res.erase(it);
}
擦除每个元素
(为完整起见:我假设这是一个简化的示例,如果您只是希望每个元素都消失而不必对其执行任何操作(例如,删除),则只需调用res.clear())
当您仅有条件地擦除元素时,您可能想要类似
for ( ; it != res.end(); ) {
if (condition) {
it = res.erase(it);
} else {
++it;
}
}
TA贡献1777条经验 获得超3个赞
for( ; it != res.end();)
{
it = res.erase(it);
}
或更笼统地说:
for( ; it != res.end();)
{
if (smth)
it = res.erase(it);
else
++it;
}
TA贡献1851条经验 获得超4个赞
作为对crazylammer答案的修改,我经常使用:
your_vector_type::iterator it;
for( it = res.start(); it != res.end();)
{
your_vector_type::iterator curr = it++;
if (something)
res.erase(curr);
}
这样做的好处是,您不必担心忘记增加迭代器,从而在您具有复杂逻辑时不容易出现错误。在循环内部,curr永远不会等于res.end(),并且无论您是否从向量中删除它,它都将位于下一个元素。
- 3 回答
- 0 关注
- 413 浏览
添加回答
举报