std::erase と std::remove の違いを理解する
std::remove アルゴリズムは、操作するために設計された多用途ツールです。任意の前方反復子のペアに適用できるため、幅広いコンテナーやシナリオに適用できます。コンテナから要素を効果的に削除する対応する std::erase とは異なり、std::remove は要素を再配置するだけです。
1。 std::remove
std::remove のニュアンスを明らかにするには、コンテナを 2 つのセクション (削除する要素を含むセクションと残りの要素を含むセクション) に論理的に分割することで機能します。これは、コンテナ内を反復処理し、削除されていない要素を前方に移動し、削除された要素を効果的に上書きすることによって行われます。ただし、 std::remove は実際には削除された要素を消去しないことに注意することが重要です。これらはメモリ内に残りますが、実際にはビューから隠されます。
この動作は、std::remove をコンテナ size() 関数と組み合わせて使用すると明らかになります。 std::remove を使用して要素を削除した後、一部の要素が論理的に削除されても、 std::size() は引き続きコンテナーの元のサイズを返します。コンテナのサイズは、std::erase を使用して非表示の要素を物理的に削除した後にのみ変更されます。
2. std::remove
の影響を視覚化する元の質問で提供されているコード スニペットを検討します。
std::vector a;
a.push_back(1);
a.push_back(2);
std::remove(a.begin(), a.end(), 1);
int s = a.size();
std::remove を実行した後、ベクトルにはまだ 2 つの要素 (2 と 2) が含まれていますが、最初の要素 (1) は論理的に削除され、ビューから非表示になります。したがって、非表示の削除された要素が存在するにもかかわらず、std::size() は 2 を返します。
3。物理的な削除に std::erase を使用する
削除された要素を物理的に削除し、コンテナのサイズを更新するには、std::erase が役に立ちます。最初の引数として std::remove によって返された反復子のペアを指定して std::erase を呼び出すと、非表示の削除された要素を削除し、コンテナーのサイズを減らすことができます:
a.erase(std::remove(a.begin(), a.end(), 1), a.end());
この場合、 std::erase は要素 1 を物理的に削除し、単一の要素 (2) と更新されたサイズ 1.
4 を持つベクトルを残します。 std::remove のユーティリティの範囲を理解する
std::remove は std::erase と組み合わせて使用するためだけに設計されているわけではありませんが、論理パーティション化が行われるさまざまなシナリオで広範に使用されています。要素が必要です。たとえば、std::remove を使用して、
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3