「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ で `std::remove` が要素を削除せずに再配置するのはなぜですか?

C++ で `std::remove` が要素を削除せずに再配置するのはなぜですか?

2024 年 11 月 19 日に公開
ブラウズ:260

  Why Does `std::remove` Rearrange Elements Instead of Deleting Them in C  ?

違いを理解する: 消去と削除

C プログラミングの領域では、std::erase と std::remove は 2 つのものです。コンテナの変更に関しては、異なる目的を果たす個別の関数です。どちらの関数もコンテナから要素を削除するために使用できますが、動作が異なります。

Std::remove: 要素の再配置と削除

Std::削除は、さまざまな要素を操作し、コンテナ内で要素を再配置するアルゴリズムです。要素を直接削除するのではなく、一致しない要素を一致する要素の上に移動します。このプロセスでは、シーケンスの先頭に一致する要素のクラスターが作成され、最後に一致しない要素のクラスターが作成されます。

Std::erase: 要素の削除

一方、 std::erase は、コンテナから指定された要素を削除し、コンテナのサイズを効果的に削減する関数です。これは、反復子の範囲を引数として受け取り、削除対象としてマークされた要素を含む、その範囲内のすべての要素を削除します。

出力について

提供されたコード例では、次のような観察が可能です:

  1. Std::remove: std::remove が使用される場合std::erase を使用しない場合、ベクトルのサイズは変更されずに、単純に要素が再配置されます。したがって、ベクトルを反復処理すると、出力は 2,2.
  2. Std::erase: になります。 std::erase を std::remove と組み合わせて使用​​すると、次のものが削除されます。一致する要素 (この場合は 1 が 1 回出現) が検出され、それに応じてベクトルのサイズが更新されます。その結果、出力には 2.

Std::remove に関する追加の注意事項

  1. Erase-Remove 以外の使用法のみが表示されます。イディオム: std::remove は一般的に「消去-削除イディオム」の一部として Erase とともに使用されますが、独立して使用することもできます。これは、削除順序が重要ではなく、主な目的がコンテナ内で一致する要素と一致しない要素を分離することであるシナリオで役立ちます。
  2. 削除しない理由: の設計削除を伴わない std::remove は、任意の前方反復子を操作できることに由来しています。このような反復子には要素を削除する機能がない可能性があるため、std::remove.
の機能は制限されます。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3