2

Cinder の Box2D テンプレートのコードを調べています。コードを変更して、画面からボックスを削除したり、ボックスを追加したりしたいと考えています。私はC ++を初めて使用しますが、他のSOの投稿から学んだことに基づいて、このifケースを使用してベクトルからボックスを削除しようとしています:

for( vector<b2Body*>::iterator boxIt = mBoxes.begin(); boxIt != mBoxes.end(); ++boxIt ) {
    if( (*boxIt)->GetPosition().x > scaledX){
        boxIt = mBoxes.erase(boxIt);
    }
    else {

        Vec2f pos( (*boxIt)->GetPosition().x, (*boxIt)->GetPosition().y );
        float t = toDegrees( (*boxIt)->GetAngle() );

        glPushMatrix();
        gl::translate( pos );
        gl::rotate( t );

        Rectf rect( -BOX_SIZE, -BOX_SIZE, BOX_SIZE, BOX_SIZE );
        gl::drawSolidRect( rect );

        glPopMatrix();
    }

}

しかし、これにより、"(*boxIt)->GetPosition().x" を 2 回目に実行すると、不正アクセス クラッシュが発生します。何か案は?

4

3 に答える 3

2

++boxIt消去後はいけません。割り当てにより、イテレータはすでに次の項目に移動しています。

for 行から削除++boxItし、elseonly に入れます。

于 2013-07-04T23:13:56.467 に答える
0

あなたの問題は、イテレータを消去してから、それを繰り返し続けていることです。

ベクトルevery iterator and reference after the point of erase is invalidated.の場合 (他のケースの概要: http://kera.name/articles/2011/06/iterator-invalidation-rules/ )

remove_if で erase を使用してみることができます (後者は実際には何も消去しません)。

http://en.wikipedia.org/wiki/Erase-remove_idiom

于 2013-07-04T23:09:25.753 に答える