怎么重写一个可以在循环过程中安全删除的容器
求助:如何重写一个可以在循环过程中安全删除的容器
最近遇到个问题,就是在标准库容器比如说std::vector遍历的过程中删除元素,而且是在元素自己执行成员函数Update的时候有可能会出现删除的情况,例如:
std::vector<MyClass> vm = {...};
for (auto iter = vm.begin(); iter != vm.end(); ++iter)
{
iter->Update();
}
在iter->Update()中有可能会执行vm.erase(),所以想设计一个新的容器,在不改变上面代码结构的情况下,可以安全的运行,求助各位大大们有没有什么好办法啊?
------解决方案--------------------
不用建立删除列表,只需要做个标记就行。外层循环第一次做标记,第二次把已经做了标记的删除(remove-erase手法)
职责要分清楚, A不应该修改B, B也不应该修改C的呀。
------解决方案--------------------
如果是这样,你的vector设计肯定有问题了,像你这种要update User信息的,一般上vector里面都是指针vector<UserData*>。这样,无论你怎么操作*UserData都不会对vector造成影响,你要删除*UserData也没有问题,删除后,将UserData=Null即可,每次使用iter之前,先对iter做判断,确认它指向非null即可,用vector<User*>而不是vector<User>, 这是开发中常用的技巧。
最近遇到个问题,就是在标准库容器比如说std::vector遍历的过程中删除元素,而且是在元素自己执行成员函数Update的时候有可能会出现删除的情况,例如:
std::vector<MyClass> vm = {...};
for (auto iter = vm.begin(); iter != vm.end(); ++iter)
{
iter->Update();
}
在iter->Update()中有可能会执行vm.erase(),所以想设计一个新的容器,在不改变上面代码结构的情况下,可以安全的运行,求助各位大大们有没有什么好办法啊?
------解决方案--------------------
不用建立删除列表,只需要做个标记就行。外层循环第一次做标记,第二次把已经做了标记的删除(remove-erase手法)
职责要分清楚, A不应该修改B, B也不应该修改C的呀。
------解决方案--------------------
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>, 这是开发中常用的技巧。