C++ 基于范围的循环向量迭代器不可递增

C++ 基于范围的循环向量迭代器不可递增,c++,vector,iterator,C++,Vector,Iterator,在我的应用程序中,我将所有当前打开的窗口存储在一个向量中,以便进行事件处理。当窗口打开时,它将添加到向量中,并在关闭时删除。我有一个process event函数,在该函数中,我迭代该向量并用当前事件更新所有窗口: for(Window* w : windows) w->OnWindowEvent(event); 但是,如果关闭窗口,则会出现错误“Debug Assertion failed:vector iterator not incrementable”。根

在我的应用程序中,我将所有当前打开的窗口存储在一个向量中,以便进行事件处理。当窗口打开时,它将添加到向量中,并在关闭时删除。我有一个process event函数,在该函数中,我迭代该向量并用当前事件更新所有窗口:

    for(Window* w : windows)
        w->OnWindowEvent(event);
但是,如果关闭窗口,则会出现错误“Debug Assertion failed:vector iterator not incrementable”。根据我的理解,如果当前迭代器无效,比如当删除一个元素时,就会发生类似的情况,这是我在这里和其他网站上读到的。但我不会在这里这么做。另一件奇怪的事情是,如果我使用“传统”for循环,如下所示:

for(int i = 0; i < windows.size(); i++)
    windows[i]->OnWindowEvent(event);
for(int i=0;iOnWindowEvent(事件);
然后我可以直接使用相同的基于范围的循环,没有任何错误。
我在这里遗漏了什么吗?

我假设关闭窗口会修改容器
windows
。根据容器的类型和移除元素的方式,它可能会使容器的部分或所有引用和迭代器无效。在对容器进行迭代时,不能在容器上执行使其迭代器无效的操作。是否在
OnWindowEvent()中执行任何操作
change the vector?@FrançoisAndrieux我只是在做了更改之后才对它进行迭代,并且我没有保留对vector或iterator@Leon2806基于范围的for循环在后台使用迭代器。您将不得不担心使迭代器无效,即使您自己没有手动处理或保留任何迭代器。如果
w->OnWindowEvent(事件)决不能导致对
windows
的任何更改使迭代器无效。@Galik谢谢!就这样。我猜有时候你只是瞎了眼,看不到显而易见的东西:)。如果窗口收到关闭事件,我将调用Window::Dispose,Dispose将从容器中删除该窗口。