我目前正在我的应用程序中使用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;
}
答案 0 :(得分:0)
如果你现在正在访问最后一个(首先使用反向迭代器)元素,这应该只是一个问题。这是因为您正在递增由pop_back()
如果是这种情况,一种解决方案是首先增加迭代器,存储结果而不是调用method()
。
答案 1 :(得分:0)
问题是it
在您尝试使用它时调用pop_back()
导致未定义行为的那一刻失效。您应该在调用方法之前存储下一步:
for(auto it = list.rbegin(); it != list.rend();)
{
auto itr = it++;
(*itr) -> method();
}