## `std::vector` の `erase` 後はすべてのイテレータが無効になりますか?

Barbara Streisand
リリース: 2024-10-25 10:43:30
オリジナル
574 人が閲覧しました

## Are All Iterators Invalid After `erase` on a `std::vector`?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!