"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());
我在我的 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());