STLアルゴリズム: ループを書くな
手書きループより安全・高速・読みやすい。
アルゴリズム
コンテナ操作の汎用関数群。
イテレータ
要素を指すポインタ風オブジェクト。
Ranges
C++20のパイプライン記法。
アルゴリズムとは?
#include <algorithm>#include <vector>
std::vector<int> nums = {5, 2, 8, 1, 9};
// ソートstd::sort(nums.begin(), nums.end()); // {1, 2, 5, 8, 9}
// 検索auto it = std::find(nums.begin(), nums.end(), 5);
// 変換std::transform(nums.begin(), nums.end(), nums.begin(), [](int n) { return n * 2; });実行結果
{5,2,8,1,9} → sort → {1,2,5,8,9}
transform(*2) → {2,4,10,16,18} Bad
// ❌ Bad: 手書きループbool found = false;for (int i = 0; i < vec.size(); ++i) { if (vec[i] == target) { found = true; break; }}Good
// ✅ Good: アルゴリズムを使うbool found = std::find(vec.begin(), vec.end(), target) != vec.end();
// C++20: rangesbool found = std::ranges::contains(vec, target);Ranges (C++20)
// C++20 Ranges: パイプライン記法#include <ranges>namespace rv = std::ranges::views;
std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto result = nums | rv::filter([](int n) { return n % 2 == 0; }) // 偶数 | rv::transform([](int n) { return n * n; }) // 二乗 | rv::take(3); // 最初の3つ
// result: {4, 16, 36} Tip: Ranges は遅延評価。実際に結果を使うまで計算しない。
合格ライン
sort, find, transform を使える
ラムダをアルゴリズムに渡せる
参考リンク
演習課題
課題1: sort + lambda
構造体のvectorを特定のメンバでソートしてください(降順)。
課題2: transform
文字列のvectorを全て大文字に変換してください。