std::vector を反復処理し、ベクターのサイズの変更が必要なアクション (削除など) を実行する場合要素を使用すると、イテレータが無効になるという問題が発生する可能性があります。これは、要素の削除に使用される Erase() メソッドがベクトルのサイズを変更し、既存のイテレータをすべて無効にするためです。
これを克服するには、戻り値を使用するのが効率的な解決策です。これは、削除された要素の直後にある要素を指す新しい有効な反復子を提供します。これにより、無効化された反復子を気にすることなく反復を続行できます。
次のコードは、このアプローチを示しています。
<code class="cpp">std::vector<std::string>::iterator iter; for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) { if (::DeleteFile(iter->c_str())) { iter = m_vPaths.erase(iter); // Returns a new valid iterator } else { ++iter; // Advance iterator if file deletion failed } }</code>
このコードでは、反復子は、ファイルの削除が成功するたびに次の要素が追加され、反復をスムーズに進めることができます。
反復子のアプローチを使用すると効率的ですが、元の m_vPaths ベクトルが変更されるため、パフォーマンスが向上する可能性があります。複数の削除が必要な場合に影響します。このような場合は、要素を効率的に削除するために最適化された代替データ構造 (
以上が反復中に std::vector から要素を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。