擦除期间std容器迭代器失效

Gas*_*sim 2 c++ g++ std composite-component

可能重复:
向量擦除迭代
器调用erase()后std :: map :: iterator问题


我对我的一段代码感到担忧.我有组件和存储组件的对象.问题是在组件可以告知从对象中删除组件的更新期间.但它从另一个功能调用.

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);

}
Run Code Online (Sandbox Code Playgroud)

并假设我有很多组件 - 健康,活着,图形,物理,输入等.

我试过这样的东西(带有一些测试组件)并且在更新期间没有错误.但我真的很担心.它可以在将来给我一个错误吗?如果是的话,如何解决?

提前谢谢,
Gasim

Ker*_* SB 6

您无法遍历容器并说明++i何时i可能不再有效(因为您已将其删除).典型的擦除循环如下:

for (it = x.begin(); it != x.end(); /* nothing here! */)
{
  if (must_erase(*it))
  {
    x.erase(it++); // advance it while still valid, return previous and erase
  }
  else
  {
    ++it;
  }
}
Run Code Online (Sandbox Code Playgroud)

以这种精神重写你的代码.

要说明你的问题:在Object::update(),你调用HealthComponent::update()使迭代器失效i,然后调用++i,这是未定义的行为.