ホームページ  >  記事  >  バックエンド開発  >  C で `std::remove` が要素を削除せずに再配置するのはなぜですか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 16:41:02339ブラウズ

  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-remove イディオム」の一部として Erase とともに使用されますが、独立して使用することもできます。これは、削除順序が重要ではなく、コンテナ内で一致する要素と一致しない要素を分離することが主な目的であるシナリオで役立ちます。
  2. 非削除の根拠:削除を伴わない std::remove は、任意の前方反復子を操作できることに由来しています。このような反復子には要素を削除する機能がない可能性があるため、 std::remove.
の機能が制限されます。

以上がC で `std::remove` が要素を削除せずに再配置するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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