[英]vector::erase causing strange behavior
我试图创建一个垂直滚动的射击游戏,当您按空格键时,会创建一个子弹,然后当子弹离开屏幕时,该子弹会被销毁。 我通过将向量标记为vector<BULLET> bullets;
来跟踪项目vector<BULLET> bullets;
当我尝试销毁屏幕外的任何项目符号时,都会出现大量错误,例如: c:\\mingw\\bin\\..\\lib\\gcc\\mingw32\\4.7.0\\include\\c++\\bits\\stl_algobase.h|384| required from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = true; _II = BULLET*; _OI = BULLET*]'|
c:\\mingw\\bin\\..\\lib\\gcc\\mingw32\\4.7.0\\include\\c++\\bits\\stl_algobase.h|384| required from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = true; _II = BULLET*; _OI = BULLET*]'|
我的代码如下所示:
for( auto it = bullets.begin(); it != bullets.end(); ){
if( it->is_dead()){
it = bullets.erase(it);
}else{
it++;
}
}
让我感到沮丧的部分是,我有一个类似的循环,该循环删除需要在包含指针的向量中删除的所有游戏对象:
for( auto it = activeInstances.begin();
it != activeInstances.end(); ){
if( (*it)->is_dead()){
it = activeInstances.erase(it);
}else{
it++;
}
}
而且这个效果很好。
编辑:我不确定是否有所作为,但仅供参考,我添加了稍后在将项目符号添加到向量的同一函数中出现的部分:
if( key[SPACE] && reload == 0){
reload = reloadTime;
BULLET newBullet;
newBullet.init( x, y);
bullets.push_back( newBullet);
}
您的代码片段不同:
if( it->is_dead()){
与
if( (*it)->is_dead()){
我建议使用“ 擦除删除”习惯用法从std::vector
删除项目(您可以考虑此StackOverflow问题与解答以进行详细讨论,也适用于其他容器):
// Erase elements matching "erasing_condition" from vector "v" v.erase( std::remove_if(v.begin(), v.end(), erasing_condition), v.end() );
在您的特定情况下,您可能需要使用以下代码:
//
// Erase elements matching "BULLET.is_dead()" from vector "bullets".
// ("bullets" is a "vector<BULLET>")
//
bullets.erase
(
std::remove_if
(
bullets.begin(),
bullets.end(),
// Erasing condition
[](const BULLET& bullet)
{
return bullet.is_dead();
}
),
bullets.end()
);
顺便说一句:作为样式指南 ,我更喜欢Bullet
而不是BULLET
作为C ++类名( ALL_UPPERCASE_STYLE
通常为C ++中的预处理器宏保留)。
正如有人在评论中提到的那样,问题是我没有在BULLET类中使用move构造函数(我是一个菜鸟,直到被提及之前我都不知道那是什么)。 我真的很感谢大家的帮助,实际上我学到了很多东西!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.