Erase-Remove_If イディオム: 正しい適用
Erase-remove_if イディオムは、コンテナーから要素を効率的に削除する多用途の手法です。述語。ただし、実装が不適切だと予期しない結果が生じる可能性があります。
指定された例では、erase-remove_if を使用してペアのベクトルから .first 値が 4 のペアを削除することを目的としています。ただし、コードには重複が残されており、エラーが示されています。
正しいコードは次のとおりです。
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 スワップベクトル内の要素を抽出して、述語に一致しない要素を先頭にグループ化します。次に、削除する最初の要素にイテレータを返し、保持する要素と削除する要素の間の区切りをマークします。
std::vector::erase は返されたイテレータから開始し、後続の要素をすべて消去し、効果的に削除します。述語に一致するすべての要素。
最初のコードでは、std::erase の 2 番目のパラメータを省略したため、返されたイテレータによって示される要素のみが返されます。削除されました。述語に一致する後続の要素が消去されなかったため、重複が発生しました。
2 番目のパラメーター stopPoints.end() を含めることで、返されたイテレータから始まり、イテレータの最後までの範囲を削除するように Erase に指示します。ベクトルを使用して、一致する要素がすべて削除されるようにします。
消去-削除イディオムのより包括的な情報については、Wikipedia のエントリを参照してください。 https://en.wikipedia.org/wiki/Erase–remove_idiom
以上がErase-Remove_If コードが重複して残るのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。