【问题标题】:Having an issue with c++ stl listsc++ stl 列表有问题
【发布时间】:2012-11-15 20:03:28
【问题描述】:

我有以下功能。

void BulletFactory::update(Uint32 ticks) {
  std::list<Sprite*>::iterator it = activeBullets.begin();
  while (it != activeBullets.end()) {
    (*it)->update(ticks);
    if(!((*it)->inView())) {
      activeBullets.remove(*it);
      Sprite* temp = *it;
      it++;
      inactiveBullets.push_back(temp);
    } else {
      it++;
    }
  }
}

当条件!((*it)-&gt;inView())true 时,存在分段错误。我看不到问题。

编辑:忘了说 activeBullets 和 inactiveBullets 是两个列表。

【问题讨论】:

  • 从这样的列表中删除是不安全的,您需要将删除的结果作为新的迭代器。

标签: c++ list stl


【解决方案1】:
 activeBullets.remove(*it);
 Sprite* temp = *it; //<--- problem
 it++; //<-- problem

应该是:

  Sprite* temp = *it;
  it = activeBullets.erase(it); //use erase
  //it++; don't increment it

【讨论】:

  • 它有效,但你能更详细地解释一下这个问题吗?删除和擦除有什么区别。
  • @user1198065:这个网站上有很多主题。你可以搜索它们。例如,看到这个:stackoverflow.com/questions/596162/…
【解决方案2】:

您不能修改迭代器指向的元素,因为它会使迭代器无效。解决方案见this question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多