std::list の要素の反復と削除
std::list の反復中に要素を削除するには、慎重な処理が必要です。イテレータの無効化を避けてください。よくある誤解の 1 つは、評価直後に要素を削除すると反復子が正しくインクリメントされると想定することです。ただし、この方法では、「リスト反復子は増分できません」というエラーが発生します。
反復子の動作について
std::list では、要素は連続的に割り当てられます。要素が削除されると、後続の要素が移動して空いたスペースを埋めます。その結果、削除された要素を最初に指していたイテレータは無効になります。この反復子をインクリメントすると、未定義の動作が発生します。
正しいアプローチ: 最初にインクリメントし、後で削除します
反復中に要素を正しく削除するには、次の戦略を採用します:
while ループを使用した変更コード:
std::list<item*>::iterator i = items.begin(); while (i != items.end()) { bool isActive = (*i)->update(); if (!isActive) { items.erase(i++); // alternatively, i = items.erase(i); } else { other_code_involving(*i); ++i; } }
この変更コードはリストを反復処理し、次のようにします:
Remove_if アプローチの回避
元のコードには、ループの後に Remove_if() 呼び出しが含まれていました。この方法では、リストに対する追加のパスが必要となるため、このような状況では通常は推奨されません。上に示したように、1 回のパスで反復と削除を行うことは、より効率的でシンプルなソリューションです。
以上がstd::list から要素を安全に反復して削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。