繁体   English   中英

vector :: erase导致奇怪的行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM