1

次のことを考慮してください。

for (it = list.begin(); it != list.end(); ++it) {
    if (!(*it)->alive) {
        it = list.erase(it);
    }
}

これは、である限り正常に機能しlist.size() > 1ます。リストに要素が1つだけ含まれると、segfaultを消去するための呼び出し。次の要素がないので想定しています。少なくとも、それは私が観察している行動です。これを処理する正しい方法はありますか?おそらくまったく異なるアプローチですか?

ご覧のとおり、リストをすぐにクリアしたくありません。要素が死んだときに削除したいのですが、これは最後の要素が削除されるまで正常に機能します。

4

1 に答える 1

10

以下は正しく機能します。

for (it = list.begin(); it != list.end(); ) {
    if (!(*it)->alive) {
        it = list.erase(it);
    } else {
        ++it;
    }
}

問題は特定のサイズだけではありません。あなたの例では、要素を削除するたびに要素をスキップしています。考えてみてください。

要素が「生きている」場合は、次のようにします。it = list.erase(it);これにより、要素が削除され、次の要素に設定itされます。次に、ループが実行++itされ、次のループがスキップされ、場合によってはスキップされend()ます。

これはスキップの問題だけでなく、end()他の要素もスキップしていましたが、リストの最後の要素を削除するとクラッシュする可能性があります。

于 2011-06-21T19:41:38.260 に答える