C++报错List iterator is not incrementable问题求助
解决“List iterator is not incrementable”报错的问题
嘿,我太懂你好久没碰C++重新捡起来磕磕绊绊的感觉了!这个报错其实是遍历std::list时处理erase操作的典型坑,咱们直接说问题出在哪,怎么改。
你这段代码的核心问题是:当你调用io_queue.erase(it)之后,原来的it就变成了失效的迭代器,但你的for循环末尾还会执行++it——对一个已经失效的迭代器做递增操作,自然就会触发“List iterator is not incrementable”的错误。
好在std::list::erase方法会返回一个指向被删除元素下一个位置的有效迭代器,我们可以利用这个返回值来正确更新迭代器,不用再手动去递增失效的那个。
修正后的代码如下:
if (!io_queue.empty()) { // 注意这里去掉了循环条件里的++it for (list<Process>::iterator it = io_queue.begin(); it != io_queue.end();) { if (it->isBurstDone()) { if (it->isComplete()) { it->setExit(clock); complete.push_back(*it); // 用erase的返回值更新it,指向删除元素的下一个位置 it = io_queue.erase(it); } else { ready_queue.push_back(*it); it = io_queue.erase(it); } } else { it->decBurst(); // 只有没执行erase的时候,才手动递增迭代器 ++it; } } }
简单说下逻辑:
- 循环条件里不再自动递增it,把递增的控制权交给我们自己
- 当需要删除元素时,直接用erase返回的有效迭代器覆盖it
- 不需要删除元素时,再手动执行
++it,保证迭代器始终有效
这样修改后,就不会再出现迭代器失效导致的报错了,你可以试试这个版本~
内容的提问来源于stack exchange,提问作者J.Correa
相关产品推荐
相关产品推荐

