vector :: erase导致奇怪的行为

时间:2013-07-15 09:14:02

标签: c++ vector erase allegro

我正在尝试创建一个垂直滚动的射击游戏,当你按空间时会创建一个子弹,然后当子弹离开屏幕时,子弹就会被摧毁。我通过矢量delcared跟踪子弹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*]'|

我的代码如下所示:

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

3 个答案:

答案 0 :(得分:1)

您的代码拼写不同:

if( it->is_dead()){

VS

if( (*it)->is_dead()){

答案 1 :(得分:1)

我建议使用删除删除习惯用法std::vector中删除项目 (您可以考虑this StackOverflow Q&A进行详细讨论,也可以考虑应用于其他容器):

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

BTW:作为样式指南,我更喜欢Bullet代替BULLET来获取C ++类名称(ALL_UPPERCASE_STYLE通常保留给预处理器宏用C ++ ...)。

答案 2 :(得分:0)

正如其中一条评论中提到的那样,问题在于我没有在我的BULLET课程中使用移动构造函数(我是一个总菜鸟,甚至不知道它是什么,直到它被提到) 。我非常感谢大家的帮助,我实际上学到了很多东西!