1. ホーム
  2. c++

[解決済み] C++ : リストのイテレータがインクリメントされない

2022-02-07 19:47:51

質問

リストの最後の要素を消去しようとすると、このエラーが発生します。デバッグしてみたところ、原因と場所がわかりましたので、以下にコードを示します。

    for(Drop_List_t::iterator i = Drop_System.begin(); i != Drop_System.end() && !Drop_System_Disable; /**/)
{
    if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
    {
        i = Drop_System.erase(i);
    }

    ++i; //List iterator crashes here if last entry was deleted
}

何が間違っているのかがわからない...。何かいい方法はないでしょうか?

解決方法は?

を理解していないため、アルゴリズムに欠陥があります。 erase を返します。

を使用した場合 erase は、イテレータが指す要素を削除し、次の要素へのイテレータを返します。

リストのすべての要素に対して反復処理を行いたい場合、リスト内のすべての要素に対して反復処理を行うには、常に erase が使用された場合、それ以上インクリメントしてはいけません。

これは 通常 というコードが表示されるはずです。

if (Player->BoundingBox.Intersect(i->BoundingBox)) {
  i = Drop_System.erase(i);
}
else {
  ++i; 
}

そして、これであなたが遭遇している問題をきちんと解決しています! なぜなら erase が最後の要素です。 erase と同じイテレータを返します。 end つまり、最後の要素の1つ前を指すイテレータです。このイテレータは とする。 は決してインクリメントされません (リストが空でない場合はデクリメントされることがあります)。