为了账号安全,请及时绑定邮箱和手机立即绑定

矢量擦除迭代器

矢量擦除迭代器

C++
慕田峪7331174 2019-11-12 13:03:54
我有以下代码:int main(){    vector<int> res;    res.push_back(1);    vector<int>::iterator it = res.begin();    for( ; it != res.end(); it++)    {        it = res.erase(it);        //if(it == res.end())        //  return 0;    }}“一个随机访问迭代器,它指向该函数调用删除的最后一个元素之后的元素的新位置,如果操作删除了序列中的最后一个元素,则该向量为向量结束。”该代码崩溃,但是如果我使用该if(it == res.end())部分然后返回,则可以正常工作。怎么会?for循环是否缓存,res.end()以便不等于运算符失败?
查看完整描述

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;

  }

}


查看完整回答
反对 回复 2019-11-12
?
慕森王

TA贡献1777条经验 获得超3个赞

for( ; it != res.end();)

{

    it = res.erase(it);

}

或更笼统地说:


for( ; it != res.end();)

{

    if (smth)

        it = res.erase(it);

    else

        ++it;

}


查看完整回答
反对 回复 2019-11-12
?
繁花不似锦

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(),并且无论您是否从向量中删除它,它都将位于下一个元素。


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 413 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信