ペア削除の 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 メカニズムの理解:
さらに詳しい洞察については、[Erase-Remove Idiom](https://en.wikipedia.org/) に関するウィキペディアの記事を参照してください。 wiki/Erase-remove_idiom).
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3