std :: list - 删除元素

时间:2018-01-04 18:50:43

标签: c++ stdlist outofrangeexception

我目前正在我的应用程序中使用std :: list并试图摆脱超出范围的问题。

我需要在迭代时在一个对象的方法中使用pop_back。我认为它可能会以某种方式改变std :: list :: end。有没有可能让它正常工作?这段代码应该看起来像这样:

编辑:我正在使用GCC 6.1

  

编辑2:如果您遇到与reverse_iterator相关的相同问题,我建议您尽可能重新设计应用程序并使用临时迭代器。它更直观。

#include <list>

struct Object;

std::list<Object*> list;

struct Object
{
    Object(bool state) : state(state) {}
    bool state;
    void method()
    {
        if(state) list.pop_back();
    }
};


int main()
{
    list.push_back(new Object(false));
    list.push_back(new Object(true));
    list.push_back(new Object(false));
    for(auto it = list.rbegin(); it != list.rend(); ++it)
    {
        (*it) -> method();
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

如果你现在正在访问最后一个(首先使用反向迭代器)元素,这应该只是一个问题。这是因为您正在递增由pop_back()

无效的迭代器

如果是这种情况,一种解决方案是首先增加迭代器,存储结果而不是调用method()

答案 1 :(得分:0)

问题是it在您尝试使用它时调用pop_back()导致未定义行为的那一刻失效。您应该在调用方法之前存储下一步:

for(auto it = list.rbegin(); it != list.rend();)
{
    auto itr = it++; 
    (*itr) -> method();
}