猿问

矢量擦除迭代器

我有以下代码:


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()以便不等于运算符失败?


慕田峪7331174
浏览 414回答 3
3回答

慕莱坞森

res.erase(it) 始终返回下一个有效的迭代器,如果您删除最后一个元素,它将指向 .end()在循环的末尾++it总是被调用,因此您.end()不允许递增。简单地检查.end()仍然会留下一个错误,因为您总是在每次迭代中都跳过一个元素(it从的返回值“递增” .erase(),然后在循环中再次递增)您可能想要类似的东西:&nbsp;while (it != res.end()) {&nbsp; &nbsp; &nbsp; &nbsp; it = res.erase(it);&nbsp; &nbsp;&nbsp;&nbsp;}擦除每个元素(为完整起见:我假设这是一个简化的示例,如果您只是希望每个元素都消失而不必对其执行任何操作(例如,删除),则只需调用res.clear())当您仅有条件地擦除元素时,您可能想要类似for ( ; it != res.end(); ) {&nbsp; if (condition) {&nbsp; &nbsp; it = res.erase(it);&nbsp; } else {&nbsp; &nbsp; ++it;&nbsp; }}

慕森王

for( ; it != res.end();){&nbsp; &nbsp; it = res.erase(it);}或更笼统地说:for( ; it != res.end();){&nbsp; &nbsp; if (smth)&nbsp; &nbsp; &nbsp; &nbsp; it = res.erase(it);&nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; ++it;}

繁花不似锦

作为对crazylammer答案的修改,我经常使用:your_vector_type::iterator it;for( it = res.start(); it != res.end();){&nbsp; &nbsp; your_vector_type::iterator curr = it++;&nbsp; &nbsp; if (something)&nbsp; &nbsp; &nbsp; &nbsp; res.erase(curr);}这样做的好处是,您不必担心忘记增加迭代器,从而在您具有复杂逻辑时不容易出现错误。在循环内部,curr永远不会等于res.end(),并且无论您是否从向量中删除它,它都将位于下一个元素。
随时随地看视频慕课网APP
我要回答