変更アルゴリズム: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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 非変更アルゴリズム:find、count、all_of
- 変更アルゴリズム:transform、copy_if、replace
- ソートとパーティション:sort、stable_partition
- 数値アルゴリズム:accumulate、reduce、transform_reduce