1

わかりました、これはおそらくかなり基本的なことですが、私はこれまでやったことがありません。

私は s のベクトルを持っておりParticle、それらが可視画面を離れたら、それらを消去したいと考えています。Particle消去削除イディオムを調べましたが、インスタンスも削除する必要があるため、それを機能させる方法がわかりません。私は成功せずに後方反復を試みました:

for ( std::vector<Particle*>::reverse_iterator rit = particles.rbegin(); rit != particles.rend(); ++rit )
{
    if ( IsOffScreen((*rit)->pos) )
    {
        delete (*rit.base());
        particles.erase(rit.base());
    }
}

実行時クラッシュ時に、Visual Studio は"iterator cannot be decremented". 私は何を間違っていますか?より良い方法はありますか?

4

1 に答える 1

1

どうですか:

for (std::vector<Particle*>::iterator it = particles.begin(); it != particles.end(); ++it) {
    if (IsOffScreen((*it)->pos)) {
        delete *it;
        *it = NULL;
    }
}
particles.erase(std::remove(particles.begin(), particles.end(), NULL), particles.end());

他にもさまざまなオプションがあります。たとえば、述語でそれらを実際に削除できます。IIRC では、各項目に対して 1 回だけ実行されることが保証されているためです。

削除されたオブジェクトは未定義の状態のままであるため、この種のことには注意する必要があります。そのため、それらを後で削除することはできませんremove(そのために使用できますが、遅くなります)。remove_ifremovestd::partition

于 2013-10-20T14:41:01.510 に答える