std::vector イテレータの無効化: 消去後のすべてのイテレータの無効化
一般に、ベクトルから要素を削除すると、ポイントするイテレータのみが無効になると理解されています。消去された要素の後の位置に移動します。ただし、重要な問題が発生します。消去された位置の反復子はまだ有効ですか?
C 標準によれば、答えはノーです。消去に渡されたイテレータ以降のすべてのイテレータは無効になります。これは、ベクトルから奇数の整数を削除することを目的とした次のコードが未定義の動作を引き起こすことを意味します:
<code class="cpp">typedef std::vector<int> vectype; vectype vec; // Initialize the vector for (int i = 0; i < 100; ++i) vec.push_back(i); vectype::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); // Invalidating iterator else ++it; }</code>
反復処理を正しく行う
反復を処理するには消去後は、erase によって返されたイテレータを使用してください。この反復子は、消去された要素の直後の要素 (要素がない場合は最後) を指します。
この場合、奇数の整数を削除するためのより効率的なアプローチは、erase- を使用することです。イディオムを削除:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
以上が## `std::vector` の `erase` 後はすべてのイテレータが無効になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。