我有代码看起来像这样:
for (std::list<item*>::iterator i=items.begin();i!=items.end();i++)
{
bool isActive = (*i)->update();
//if (!isActive)
// items.remove(*i);
//else
other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);
Run Code Online (Sandbox Code Playgroud)
我想在更新后立即删除非活动项目,以避免再次走过列表.但是如果我添加注释掉的行,当我到达时会出现错误i++:"List iterator not incrementable".我尝试了一些替代品,它们没有在for语句中增加,但我无法得到任何工作.
当你走std :: list时,删除项目的最佳方法是什么?
我在一个函数中有一个循环,它从头到尾迭代std::list.
在每个循环中,我执行一些检查,并可能对当前列表条目进行一些操作,在某些情况下,我想从列表中删除它.
现在,正如预期的那样,我的迭代器变得无效.
新的cpp.当我调用擦除迭代器而不增加它时,我的程序立即退出而没有任何符号或崩溃.在下面的示例中,仅打印'After if condition'而不是任何内容.没有显示错误.但是,如果我正确调用 list.erase(it ++); 比打印全部. 我的问题是当我没有把它称为正确时发生的事情.为什么我没有看到任何崩溃或退出?我担心,我问这个问题的原因是为了捕捉这些崩溃,为什么我没有在捕获区中捕获它?有没有办法抓住它?
int main(int argc, char *argv[]) {
try {
list<int>::iterator it;
list<int> list;
list.push_back(1);
for (it = list.begin(); it != list.end(); ++it) {
if ((*it) == 1) {
list.erase(it);
}
cerr << "After if condition " << endl;
}
cerr << "After for condition" << endl;
} catch (...) {
cerr << "catch exception" << endl;
}
cerr << "Finish" << endl;
}
Run Code Online (Sandbox Code Playgroud)