ホームページ >バックエンド開発 >C++ >C の std::remove はどのように機能しますか?また、std::remove と std::erase の違いは何ですか?

C の std::remove はどのように機能しますか?また、std::remove と std::erase の違いは何ですか?

DDD
DDDオリジナル
2024-10-30 02:42:02662ブラウズ

How does std::remove in C   function, and what is the difference between std::remove and std::erase?

std::remove の機能を理解する

C では、 std::remove アルゴリズムは 2 つの forward で表される任意のシーケンスに対して動作します。イテレータ。その目的は、シーケンス内の要素を再配置し、一致しない要素を前方に移動することです。 std::erase とは異なり、remove はコンテナーから要素を物理的に削除しません。代わりに、それらを再編成します。

次のコード スニペットを考えてみましょう:

std::vector<int> a;
a.push_back(1);
a.push_back(2);

std::remove(a.begin(), a.end(), 1);

std::vector<int>::iterator iter = a.begin();
std::vector<int>::iterator endIter = a.end();

std::cout << "Using iter...\n";
for (; iter != endIter; ++iter)
{
    std::cout << *iter << "\n";
}

std::cout << "Using size...\n";
for (int i = 0; i < a.size(); ++i)
{
    std::cout << a[i] << "\n";
}

出力は次のようになります:

Using iter...
2
2

Using size...
2
2

remove により要素が 2 前方に実質的に移動されましたが、初期化されていないメモリが削除されていないため、ベクトルのサイズは 2 のままです。

Erase-Remove Idiom

消去-削除イディオムは、削除と消去を組み合わせて、不要な要素を物理的に削除します。コード:

a.erase(std::remove(a.begin(), a.end(), 1), a.end());

は、ベクトルから要素 1 を削除し、そのサイズを 1 に縮小します。

std::remove の使用例

remove の主な使用法は消去と削除のイディオムですが、次のような他の状況でも利用できます。

  • 要素の最後の出現を識別する: を除くすべての出現を削除することによって最後のものでは、remove によって返された反復子を使用して最終的な外観を特定できます。
  • 一意の要素を含む新しいシーケンスの作成: 重複した要素を削除することで、個別の要素のみを含む新しいシーケンスを生成できます。
  • シーケンスを 2 つの部分に分割する:remove を使用すると、シーケンスを 2 つのセグメントに分割できます。1 つは一致する要素を含み、もう 1 つは一致しない要素を含みます。

以上がC の std::remove はどのように機能しますか?また、std::remove と std::erase の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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