c++ - 擦除期间std容器迭代器无效[重复]

可能的重复:
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);

}

假设我有很多组件——健康、活动、图形、物理、输入等等。
我尝试了类似的方法(使用一些测试组件),在更新期间没有错误。但我真的很担心。以后会不会给我一个错误?如果是,如何修复?
提前谢谢你,
卡西姆


最佳答案:

++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;
  }
}

用这种精神重写你的代码。
要阐明您的问题:在Object::update()中,您调用HealthComponent::update()使迭代器无效,然后调用i,这是未定义的行为。

译文:来源   文章分类: c++ g++ std composite-component

相关文章:

c++ - 在getline上检查eof()(即while(!getline()。eof())和仅检查while(getline())的区别是什么?

c++ - 中断语句上的分段错误?

c++ - 在简单(?)项目中将emscripten与CMake一起使用

c++ - 确定QKeyEvent的来源

c++ - 如何为动态加载编写MPI包装器

c++ - 为什么inject-class-name有时不被视为类模板中的模板名称?

c++ - 为什么我的字符*无缘无故地发生变化?

c++ - 一个继承自两个类的类,具有相同的函数原型,相互冲突

c++ - CUDA错误未定义对“ cufftPlan1d”的引用?

c++ - 如何在Windows中安装PDCurses以与C ++一起使用?