"Vector iterator not incrementable" 错误

"Vector iterator not incrementable" error

我在我的 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)。

如何解决这个错误?谢谢

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

下面的代码只是为了更好地理解这个问题,但你必须这样做:

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