導入
アルゴリズムにラムダを渡すと、「どう並べるか」「どの要素を数えるか」「各要素に何をするか」を自由に指定できます。これがモダン 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++ の定番です。ループを手書きするより短く、意図が明確で、間違いが減ります。「範囲+処理」を組み合わせて考えましょう。