ホームページ >バックエンド開発 >C++ >Erase-Remove_if イディオムを使用してベクターから要素を削除すると期待どおりに機能しないのはなぜですか?

Erase-Remove_if イディオムを使用してベクターから要素を削除すると期待どおりに機能しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-16 15:01:02821ブラウズ

Why Does Using the Erase-Remove_if Idiom to Remove Elements From a Vector Not Work As Expected?

ベクトル削除の Erase-remove_if イディオムを理解する

C では、erase-remove_if イディオムは、オブジェクトから要素を効率的に削除するために広く使用されています。指定された基準に基づいてベクトルを決定します。このイディオムが誤って実装された具体的な例を詳しく調べて、潜在的な落とし穴を探ってみましょう。

問題:

整数と方向のペアを含む stopPoints というベクトルを考えてみましょう。価値観。目標は、erase-remove_if イディオムを使用して、特定の整数 (例: 4) を含むすべてのペアをベクトルから削除することです。しかし、コードを実行した後の結果は予期せぬものでした。

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

この操作の後、ベクトルには .first 値が 4 に設定されたペアのインスタンスがまだ含まれていました。

解決策:

エラーは消去関数の誤った使用にあります。 Erase-remove_if イディオムでは、std::erase 関数には 2 つのイテレータが必要です。1 つは削除する最初の要素へのイテレータ、もう 1 つはコンテナの最後へのイテレータです。

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

この修正された実装では、 std::remove_if によって返される反復子 (削除する最初の要素を指す) からベクトルの末尾までの範囲が消去され、述語 (この場合は .first == 4) に一致するすべての要素が効果的に削除されます。

説明:

  • std::remove_if はベクトルをスキャンし、述語に一致する要素 (.first == 4 の要素) を最後まで移動します。
  • std::remove_if は、述語に一致しない最初の要素 (つまり、保持する最初の要素) を指すイテレータを返します。
  • std::erase は、返されたイテレータから要素の範囲を削除します。 .first == 4 ですべての要素を効果的に削除します。

結論:

erase-remove_if イディオムは、効率的に特定の基準を満たすベクトルから要素を削除します。関数 std::remove_if と std::erase がどのように相互作用するかを理解することは、関数を正しく実装するために重要です。

以上がErase-Remove_if イディオムを使用してベクターから要素を削除すると期待どおりに機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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