【发布时间】:2011-09-23 03:15:10
【问题描述】:
可能的重复:
vector erase iterator
Problem with std::map::iterator after calling erase()
我对我拥有的一段代码感到担忧。我有组件和一个存储组件的对象。问题是在更新期间组件可以告诉从对象中删除组件。但它是从另一个函数调用的。
void Object::update() { //using std::map here
for(ComponentMap::iterator i = components.begin(); i != components.end(); ++i) {
(*i).second->update();
}
}
void HealthComponent::update() {
if(health <= 0) object->removeComponent("AliveComponent"); //this is wrong logic. but its just an example :D
}
void Object::removeComponent(string component) {
ComponentMap::iterator i = components.find(component);
if(i == components.end()) return;
components.erase(i);
}
假设我有很多组件 - Health、Alive、Graphics、Physics、Input 等。
我尝试了类似的方法(使用一些测试组件)并且在更新期间没有错误。但我真的很担心。它可以在将来弹出我的错误吗?如果是,如何解决?
提前致谢,
加西姆
【问题讨论】:
-
在您的示例代码中,看起来您将删除一个元素,该元素不一定是
Object::update()当前正在作用的元素。这是一个更加困难的问题,如果这确实是您想要做的事情,可能需要重新考虑您的设计。 -
@karlphillip:这不是“矢量擦除迭代器”的副本,但它可能是另一个问题的副本。正如我刚刚发现的那样,序列上的
erase与关联容器上的erase的工作方式不同。
标签: c++ g++ std composite-component