ベクトル削除の 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) に一致するすべての要素が効果的に削除されます。
説明:
結論:
erase-remove_if イディオムは、効率的に特定の基準を満たすベクトルから要素を削除します。関数 std::remove_if と std::erase がどのように相互作用するかを理解することは、関数を正しく実装するために重要です。
以上がErase-Remove_if イディオムを使用してベクターから要素を削除すると期待どおりに機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。