【问题标题】:Vector range issues向量范围问题
【发布时间】:2013-11-30 00:29:24
【问题描述】:

所以我正在尝试创建一种保存/跳转系统,让玩家可以将世界的某些方面恢复到以前的点。出于某种原因,以下代码会产生矢量错误。 ("向量下标超出范围")

(entityList 是一个 ptr 而recordedEntityList 不是)

void Map::record()
{
    for(unsigned int x = 0; x < entityList.size(); x++)
    {
        if(entityList[x]->getRewind() == true)
        {
            recordedEntityList.push_back(*entityList[x]);
            printf("%f, %f\n", entityList[x]->getSprite().getPosition().x, entityList[x]->getSprite().getPosition().y);
        }
    }
}

void Map::rewind()
{
    for(unsigned int x = 0; x < entityList.size(); x++)
    {
        if(entityList[x]->getRewind() == true)
        {
            entityList.erase(entityList.begin() + x);
        }
    }

    for(unsigned int y = 0; y < recordedEntityList.size(); y++)
    {
        entityList.push_back(&recordedEntityList[y]);
    }

    recordedEntityList.clear();
}

【问题讨论】:

  • 你不能修改你正在迭代的向量(或任何容器)而不把事情搞砸。您可以查看Erase-Remove Idiom
  • 顺便说一句,看到if (condition == true) 总是让我哭泣。只需使用if (condition)
  • 如果您更改问题使我的答案过时,您可能需要发表评论...
  • 对。我很抱歉。您的答案确实过时了,虽然这是一个问题,但不是原因。
  • 我对其进行了编辑,使其不再过时。

标签: c++ vector sfml


【解决方案1】:

rewind 中,您将指向recordedEntityList 元素的指针推入entityList,然后清除recordedEntityList。这将导致entityList 包含无效的指针,并在您访问指针时调用未定义的行为。

此外,与此错误无关,在 rewind 的第一个循环中迭代向量时修改向量的方式可能会导致您跳过条目:如果两个连续的条目有 getRewind() 返回 true,则第二个不会被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 2011-11-21
    • 2011-04-13
    • 2011-10-20
    • 2016-06-21
    • 2011-04-10
    • 2011-08-11
    • 2010-11-22
    相关资源
    最近更新 更多