&引用;向量迭代器不可递增“;错误 我在我的COCOS2D X C++游戏中添加了硬币系统。我有个问题。 我想在硬币组消失时自动释放它们。我的意思是,如果一个硬币组滑过场景并退出场景,我想摧毁它。怎么做

&引用;向量迭代器不可递增“;错误 我在我的COCOS2D X C++游戏中添加了硬币系统。我有个问题。 我想在硬币组消失时自动释放它们。我的意思是,如果一个硬币组滑过场景并退出场景,我想摧毁它。怎么做,c++,cocos2d-x,C++,Cocos2d X,像这样: for (auto gr : coinGroups) { gr->setPositionX(gr->getPositionX() - scrollSpeed); if(gr->getBoundingBox().getMaxX() < origin.x) { this->removeChild(gr); coinGroups.erase(coinGroups.begin()); } } for(自

像这样:

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

    if(gr->getBoundingBox().getMaxX() < origin.x) {
        this->removeChild(gr);
        coinGroups.erase(coinGroups.begin());
    }
} 
for(自动gr:CoinGroup){
gr->setPositionX(gr->getPositionX()-滚动速度);
如果(gr->getBoundingBox().getMaxX()移除儿童(gr);
擦除(coinGroups.begin());
}
} 
货币集团是一个

std::vector<CoinGroup*>
std::vector 但这给了我一个错误(“向量迭代器不可递增”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)
}

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

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

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)
}

寻求调试帮助的问题(“此代码为什么不工作?”)必须包括所需的行为、特定错误以及在问题本身中重现该错误所需的最短代码。请阅读如何创建。
coinGroups.erase(coinGroups.begin())
im验证基于范围的for循环使用的迭代器。您不能在基于范围的迭代中擦除,因为您使当前迭代器无效,并且无法将erase的值分配回当前迭代器。使用真正的迭代器循环或类似remove/erase的习惯用法。寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定错误以及在问题本身中重现它所需的最短代码。请阅读如何创建。
coinGroups.erase(coinGroups.begin())
im验证基于范围的for循环使用的迭代器。您不能在基于范围的迭代中擦除,因为您使当前迭代器无效,并且无法将erase的值分配回当前迭代器。使用一个真正的迭代器循环或像remove/erase这样的习惯用法。@ZanLynx remove\u如果不改变剩余循环的顺序elements@Caleth:嗯。你说得对。一定是我想到的另一个库的删除函数。我记得的那个人用最后一个元素交换了移除的元素。因此,它不必在范围的其余部分移动任何内容。在标准算法库中,
std::partition
似乎可以做到这一点。@ZanLynx哦,我想我们的意思是一样的,但我们已经互相传递了。@ZanLynx remove\u如果不改变其余部分的顺序的话。@ZanLynx remove\uelements@Caleth:嗯。你说得对。一定是我想到的另一个库的删除函数。我记得的那个人用最后一个元素交换了移除的元素。所以它不需要在剩余的范围内移动任何东西。看起来
std::partition
可以在标准算法库中做到这一点。@ZanLynx哦,我想我们的意思是一样的,但我们彼此都通过了。