怎么重写一个可以在循环过程中安全删除的容器

求助:如何重写一个可以在循环过程中安全删除的容器
最近遇到个问题,就是在标准库容器比如说std::vector遍历的过程中删除元素,而且是在元素自己执行成员函数Update的时候有可能会出现删除的情况,例如:
std::vector<MyClass> vm = {...};
for (auto iter = vm.begin(); iter != vm.end(); ++iter)
{
    iter->Update();
}
在iter->Update()中有可能会执行vm.erase(),所以想设计一个新的容器,在不改变上面代码结构的情况下,可以安全的运行,求助各位大大们有没有什么好办法啊?

------解决方案--------------------
引用:
Quote: 引用:

Update中不要修改容器, 可以把需要删除的元素做一个标记,由外层循环统一删除。 

你不元素知道自己所在的容器。 

现在就是按你说的这样做的,我建立了一个删除列表,Update删除的时候实际上是把要删除的元素存到这个列表里,在下一更新的时候统一删除。
但是有个问题就是由于不是立刻删除的,在这期间会存在很多意外情况,比如说vector中有三个元素A,B,C,A做Update的时候把B删了,但是由于没有立即更新,B继续Update,又把C删了,但实际上C不应该被删除。会有很多类似的情况,导致很多bug,查起来也挺困难,所以想重写一个可以安全删除的容器

不用建立删除列表,只需要做个标记就行。外层循环第一次做标记,第二次把已经做了标记的删除(remove-erase手法)

职责要分清楚, A不应该修改B, B也不应该修改C的呀。
------解决方案--------------------
引用:
Quote: 引用:

for (auto iter = vm.begin(); iter != vm.end(); ++iter)
{
      iteri=ter->Update();//你既然要删了vm的元素,iter的值肯定是无效的了,用返回值更更它不是必然的吗?
}

我也考虑过,但是现在的情况是我在Update里调用了lua的函数,然后在lua里做了一些事情,lua有可能会回调C++的函数来做删除,所以Update无法有返回值

如果是这样,你的vector设计肯定有问题了,像你这种要update User信息的,一般上vector里面都是指针vector<UserData*>。这样,无论你怎么操作*UserData都不会对vector造成影响,你要删除*UserData也没有问题,删除后,将UserData=Null即可,每次使用iter之前,先对iter做判断,确认它指向非null即可,用vector<User*>而不是vector<User>, 这是开发中常用的技巧。