相关疑难解决方法(0)

你可以在迭代它时从std :: list中删除元素吗?

我有代码看起来像这样:

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时,删除项目的最佳方法是什么?

c++ list std

233
推荐指数
7
解决办法
21万
查看次数

C++ std :: list:迭代时擦除/删除元素

可能重复:
你可以在迭代它时从std :: list中删除元素吗?

我在一个函数中有一个循环,它从头到尾迭代std::list.

在每个循环中,我执行一些检查,并可能对当前列表条目进行一些操作,在某些情况下,我想从列表中删除它.

现在,正如预期的那样,我的迭代器变得无效.

  • 有没有办法解决这个问题,在迭代它时从列表中删除元素?

c++ stl list

8
推荐指数
2
解决办法
1万
查看次数

c ++我的程序在调用list.erase之后"go"而没有增量迭代器?

新的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)

c++

2
推荐指数
1
解决办法
154
查看次数

标签 统计

c++ ×3

list ×2

std ×1

stl ×1