C++报错List iterator is not incrementable,求排查解决方法
解决C++ list迭代器无法自增的问题
嘿,我一眼就瞅出你代码里的问题啦!你碰到的list iterator not incrementable错误,根源就在迭代器的处理逻辑上。
问题分析
你在for循环里用++it推进迭代,但当调用io_queue.erase(it)后,原来的it就变成失效迭代器了——因为list是双向链表,erase会销毁当前指向的元素,对应的迭代器也就失去了指向的有效对象。可你的for循环还会继续执行++it,这就相当于对一个已经失效的迭代器做自增操作,自然会触发这个报错。
修正后的代码方案
这里给你两种靠谱的修正写法,核心都是用erase返回的有效迭代器来更新循环变量,避免对失效迭代器操作:
方案一:用while循环处理(更直观)
if (!io_queue.empty()) { auto it = io_queue.begin(); while (it != io_queue.end()) { if (it->isBurstDone()) { if (it->isComplete()) { it->setExit(clock); complete.push_back(*it); it = io_queue.erase(it); // erase返回下一个有效迭代器,直接用它继续循环 } else { ready_queue.push_back(*it); it = io_queue.erase(it); } } else { it->decBurst(); ++it; // 只有不删除元素时才手动自增迭代器 } } }
方案二:调整for循环的自增逻辑
if (!io_queue.empty()) { // 这里去掉for循环里的++it,手动控制迭代器推进 for (auto it = io_queue.begin(); it != io_queue.end(); ) { if (it->isBurstDone()) { if (it->isComplete()) { it->setExit(clock); complete.push_back(*it); it = io_queue.erase(it); } else { ready_queue.push_back(*it); it = io_queue.erase(it); } } else { it->decBurst(); ++it; // 不删除时才自增 } } }
关键注意点
list的erase方法会返回指向被删除元素下一个位置的有效迭代器,所以你必须用这个返回值来更新迭代器变量,不能再依赖原来的迭代器做自增操作。这样就能确保每次操作的迭代器都是有效的,不会触发报错。
内容的提问来源于stack exchange,提问作者J.Correa
相关产品推荐
相关产品推荐

