## **「std::vector::erase」から返されたイテレータは削除後に有効な要素を指しますか?**

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

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

std::vector 反復子の無効化: 詳細な説明

std::vector の反復子の無効化の概念は、頻繁に議論されてきました。明確にするために、std::vector::erase を介してベクター要素を消去すると、消去された要素の後に厳密に配置されたイテレータが無効になります。

ただし、消去された要素の正確な位置におけるイテレータの有効性は不確実なままです。論理的には、ベクトルの基礎となる実装は通常、空のスペースを埋めるために残りの要素をシフトするため、この反復子は有効なままであると想定できます。ただし、正確な動作と未定義の結果の可能性はそれほど確実ではありません。

ベクトルからの奇数の整数の削除を示す次の例を考えてみましょう。

<code class="cpp">typedef std::vector<int> vectype;
vectype vec;

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);
    else ++it;
}</code>
ログイン後にコピー

このコードは次のように見えます。実際にはエラーなしで実行されますが、その有効性については議論の余地があります。

答えは、erase の動作にあります。実際に、erase に渡されたイテレータ以降のすべてのイテレータが無効になります。ただし、消去された要素の直後、またはそのような要素が存在しない場合は最後まで、新しい反復子を返す要素も返します。この反復子を使用して反復を再開できます。

各消去にはすべての整数をシフトする必要があるため、上記の奇数整数の削除方法は非効率的 (O(n2)) であることに注意することが重要です。その後の要素。消去-削除イディオムは、はるかに効率的なソリューション (O(n)) を提供します。

<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 学習者の迅速な成長を支援します!