C プログラミングでは、反復子 (Iterator) を使用してコンテナーの要素を走査するのが一般的な方法です。ただし、コンテナーを移動するときに、イテレータの有効期限が切れてプログラムがクラッシュしたり、予期しない結果が発生したりするという問題が発生することがあります。
それでは、イテレータの有効期限が切れたという問題は何でしょうか?簡単に言うと、イテレータを使用してコンテナを走査するときに、コンテナが変更されると (要素の追加や削除など)、イテレータが無効になる可能性があります。つまり、イテレータが指す要素が無効になる可能性があります。存在する時間が長くなったり、位置が変更されたりした場合、反復子を再度使用するとエラーが発生します。
イテレータの有効期限が切れた問題を解決するにはどうすればよいですか?一般的な解決策は次のとおりです:
1. 削除関数の代わりに消去関数を使用します
コンテナ要素を使用する操作では、削除関数と消去関数がよく使用されます。どちらもコンテナ内の要素を削除するために使用できますが、remove 関数は削除する要素をコンテナの最後に移動するだけで実際には要素を削除しませんが、erase 関数は実際にコンテナから要素を削除します。したがって、コンテナーをトラバースするときに要素を削除する場合は、イテレーターの有効期限が切れないようにするために、erase 関数を使用するのが最善です。
2. auto キーワードを使用する
C 11 では、反復子の型を自動的に推定できる auto キーワードが導入されています。 auto キーワードを使用すると、コンパイラはイテレータの型を自動的に照合してイテレータがコンテナの型と一致することを確認し、型の不一致の問題を回避します。
例:
vector<int> v = {1,2,3,4,5}; for(auto it = v.begin(); it != v.end(); ++it){ // ... }
auto キーワードを使用すると、コンパイラがイテレータの型を自動的に推定し、それがコンテナの型と一致することを確認できます。
3. コンテナを変更するときに正しいイテレータを使用する
コンテナを変更するときは、正しいイテレータを使用する必要があります。たとえば、ベクター コンテナを走査するときに要素を削除する場合は、erase 関数を使用する必要がありますが、erase 関数を使用すると、要素以降のすべての要素の位置が変更されます。移動された要素を指すために以前の反復子を依然として使用している場合、その反復子は無効になります。
この状況を回避するには、まず削除する要素の位置の反復子を記録し、次に削除操作を実行して、反復子の後の位置で反復子を更新して、反復子が確実にまだ正確な位置を指します。サンプル コードは次のとおりです。
vector<int> v = {1,2,3,4,5}; auto it = v.begin() + 2; // 记录要删除的元素位置 v.erase(it); // 删除元素 it = v.begin() + 2; // 更新迭代器
これにより、反復子が正しい場所を指していることが保証され、反復子の失敗の問題が回避されます。
つまり、C プログラムを作成する場合、イテレーターを使用してコンテナーを走査するのは非常に一般的な操作です。ただし、反復子の失敗は非常に一般的な問題であるため、プログラムの正確性を確保するには、この問題を回避するように注意する必要があります。
以上がC++ エラー: イテレータの有効期限が切れています。解決方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。