“矢量迭代器不可递增”错误

时间:2017-10-22 18:45:55

标签: c++ cocos2d-x

我在我的cocos2d-x c ++游戏中添加了硬币系统。我有个问题。 我想在他们离开视线时自动释放硬币组。我的意思是,如果一个硬币组滑过场景并离开现场,我想要将其摧毁。怎么做?

像这样:

for (auto gr : coinGroups) {
    gr->setPositionX(gr->getPositionX() - scrollSpeed);

    if(gr->getBoundingBox().getMaxX() < origin.x) {
        this->removeChild(gr);
        coinGroups.erase(coinGroups.begin());
    }
} 

coinGroups是

std::vector<CoinGroup*>

但是这给了我错误(“矢量迭代器不可增量”bla bla bla)。

如何解决此错误?感谢。

1 个答案:

答案 0 :(得分:2)

您无法从遍历的容器中删除元素,因为这会导致未定义的行为。 注意循环使用内部迭代器。

以下代码只是为了更好地理解这个问题,但您必须做类似的事情:

std::vector<CoinGroup*> tempCoins;
tempCoins.swap( coinGroups );
for (auto gr : tempCoins)
{
    .....

    if(gr->getBoundingBox().getMaxX() < origin.x)
        this->removeChild(gr);
    else
        coinGroups.push_back(gr)
}

c ++中的常见解决方案是使用std::remove_if

#include <algorithm> // std::remove_if

auto endIt = std::remove_if( coinGroups.begin(), coinGroups.end(), [&](CoinGroup *gr) -> bool
{
    gr->setPositionX(gr->getPositionX() - scrollSpeed);
    if (gr->getBoundingBox().getMaxX() < origin.x)
    {
        this->removeChild(gr);
        return true;
    }
    return false; 
} );
coinGroups.erase(endIt, coinGroups.end());