ホームページ  >  記事  >  バックエンド開発  >  Erase-Remove_If コードが重複して残るのはなぜですか?

Erase-Remove_If コードが重複して残るのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-10 14:33:02985ブラウズ

Why Is My Erase-Remove_If Code Leaving Duplicates?

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

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