ホームページ  >  記事  >  バックエンド開発  >  `std::vector` から要素を削除するときに、erase-remove_if が重複したペアを残すのはなぜですか?

`std::vector` から要素を削除するときに、erase-remove_if が重複したペアを残すのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-11 20:30:03302ブラウズ

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

ペア削除の Erase-Remove_if イディオム

erase-remove_if イディオムを使用してペアを削除しようとする場合std::vector> を使用すると、特有の問題が発生します。 .first 値が 4 のペアを削除のターゲットにしているにもかかわらず、最初の実装では重複したペアが残ります:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

問題の根本は不完全な消去プロセスにあります。 std::erase_if は、一致する要素をベクトルの末尾に移動するだけです。それらは削除されません。削除を完了するには、std::remove_if によって返された反復子を消去の開始点として使用するのが正しいアプローチです:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

Erase-Remove_if メカニズムの理解:

  • 要素の交換: std::remove_if は、ベクター内の要素を交換し、一致しないすべての要素を先頭に押し込みます。一致した要素は、ベクトルの後部で終了します。
  • 述語反復: 述語ラムダ式は、どの要素を削除するかを決定します。述語が true を返す場合、対応する要素はベクトルの末尾に移動されます。
  • Iterator Retrieval: std::remove_if は、述語に一致する最初の要素を指す反復子を返します。この反復子は、削除される要素の開始をマークします。
  • Vector Erasure: std::vector::erase は、返された反復子から開始してベクトルの範囲まで拡張する範囲消去操作を呼び出します。終わり。このステップでは、一致したすべての要素をベクターから削除します。

さらに詳しい情報については、[消去-削除イディオム](https://en.wikipedia.org/) に関するウィキペディアの記事を参照してください。 wiki/Erase-remove_idiom).

以上が`std::vector` から要素を削除するときに、erase-remove_if が重複したペアを残すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。