本文へスキップ
BecomeCoder

C++コース · 第15章 アルゴリズムとラムダ式 ― 処理を短く安全に · レッスン62

ラムダ × アルゴリズム ― 条件を自在に渡す

ブラウザで完結

導入

アルゴリズムにラムダを渡すと、「どう並べるか」「どの要素を数えるか」「各要素に何をするか」を自由に指定できます。これがモダン C++ でデータ処理を書くときの中心的なスタイルです。

説明

sort の第3引数にラムダを渡すと、並べ替えの基準を決められます。「2つを受け取り、左を先にするなら true を返す」関数です。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    vector<string> words = {"banana", "fig", "apple", "kiwi"};

    // 文字数の短い順に並べる
    sort(words.begin(), words.end(),
         [](const string& a, const string& b) {
             return a.length() < b.length();
         });

    for (const string& w : words) cout << w << " ";
    cout << endl;   // fig kiwi apple banana
    return 0;
}

条件に合う要素を数える count_if、各要素に処理する for_each、要素を変換する transform も、ラムダと組み合わせて使います。

flowchart LR
  d["データ"] --> ci["count_if:条件に合う数"]
  d --> fe["for_each:1つずつ処理"]
  d --> tr["transform:別の値に変換"]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v = {1, 2, 3, 4, 5, 6};

    // 偶数の個数を数える
    int evens = count_if(v.begin(), v.end(),
                         [](int x) { return x % 2 == 0; });
    cout << "偶数: " << evens << endl;   // 3

    // 各要素を2乗して別の vector に入れる
    vector<int> sq(v.size());
    transform(v.begin(), v.end(), sq.begin(),
              [](int x) { return x * x; });
    for (int x : sq) cout << x << " ";   // 1 4 9 16 25 36
    cout << endl;
    return 0;
}

まとめ

sort の比較、count_if の条件、transform の変換――処理をラムダで渡すのがモダン C++ の定番です。ループを手書きするより短く、意図が明確で、間違いが減ります。「範囲+処理」を組み合わせて考えましょう。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。