0Pricing
C++ Academy · レッスン

変更アルゴリズム:transform、copy_if、replace

標準アルゴリズムで要素を変換、フィルタリング、置換します。

「変更アルゴリズム:transform、copy_if、replace」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

変更アルゴリズム

これらのアルゴリズムは、出力範囲に書き込みます。範囲内を直接変更する場合もあれば、出力先イテレーターに書き込む場合もあります。

std::copy

ある範囲を別の範囲にコピーします。出力範囲に十分な大きさが必要です。そうでなければ、挿入イテレーターを指定してください。

#include <algorithm>
#include <iterator>
std::vector<int> src = {1, 2, 3};
std::vector<int> dst;
std::copy(src.begin(), src.end(), std::back_inserter(dst));

std::copy_if

述語に一致する要素をコピーします。

std::vector<int> evens;
std::copy_if(src.begin(), src.end(),
    std::back_inserter(evens),
    [](int x) { return x % 2 == 0; });

std::transform

各要素に関数を適用し、結果を書き込みます。他の言語におけるmapに相当します。

std::vector<int> v = {1, 2, 3};
std::vector<int> sq;
std::transform(v.begin(), v.end(),
    std::back_inserter(sq),
    [](int x) { return x * x; });
// sq is {1, 4, 9}

2つの範囲に対するtransform

二項関数を使って、2つの入力範囲を組み合わせます。

std::vector<int> a = {1, 2, 3};
std::vector<int> b = {10, 20, 30};
std::vector<int> sum;
std::transform(a.begin(), a.end(), b.begin(),
    std::back_inserter(sum), std::plus<int>{});
// sum is {11, 22, 33}

std::replaceとstd::replace_if

値と等しい要素(または述語に一致する要素)を、その場で置き換えます。

std::vector<int> v = {1, 2, 3, 2};
std::replace(v.begin(), v.end(), 2, 99);
// v is {1, 99, 3, 99}

std::fill

範囲のすべての要素を値に設定します。

std::vector<int> v(5);
std::fill(v.begin(), v.end(), 42);
// v is {42, 42, 42, 42, 42}

std::generate

各要素を、関数を呼び出した結果に設定します。シーケンスの生成に便利です。

std::vector<int> v(5);
int n = 0;
std::generate(v.begin(), v.end(), [&]() { return n++; });
// v is {0, 1, 2, 3, 4}

std::iota

<numeric> — 範囲を連続して増加する値で埋めます。

#include <numeric>
std::vector<int> v(5);
std::iota(v.begin(), v.end(), 10);
// v is {10, 11, 12, 13, 14}

std::reverse

範囲の要素をその場で反転します。

std::vector<int> v = {1, 2, 3, 4};
std::reverse(v.begin(), v.end());
// v is {4, 3, 2, 1}

std::rotate

middle の要素が新しい先頭になるように要素を回転させます。元の先頭要素は、回転後の範囲の末尾に移動します。

std::remove による Erase-Remove

remove は不要な要素を後方へ移動し、新しい論理的な末尾を指すイテレータを返します。実際にサイズを縮小するには erase と組み合わせます。

v.erase(
    std::remove(v.begin(), v.end(), 0),
    v.end()
);

理解度チェック

「すべての要素に関数を適用して新しいコンテナを作成する」処理に最も適したアルゴリズムはどれですか。

まとめ

変更系アルゴリズムは結果を書き込みます。copy、copy_if、transform、replace、fill、generate、iota、reverse、rotate、および erase-remove イディオムがあります。

よくある質問

「変更アルゴリズム:transform、copy_if、replace」レッスンは無料ですか?

はい。「変更アルゴリズム:transform、copy_if、replace」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「変更アルゴリズム:transform、copy_if、replace」で何を学びますか?

標準アルゴリズムで要素を変換、フィルタリング、置換します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「変更アルゴリズム:transform、copy_if、replace」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 非変更アルゴリズム:find、count、all_of
  2. 変更アルゴリズム:transform、copy_if、replace
  3. ソートとパーティション:sort、stable_partition
  4. 数値アルゴリズム:accumulate、reduce、transform_reduce
← C++ Academyに戻る