STLアルゴリズム: ループを書くな

手書きループより安全・高速・読みやすい。

アルゴリズム
コンテナ操作の汎用関数群。
イテレータ
要素を指すポインタ風オブジェクト。
Ranges
C++20のパイプライン記法。

アルゴリズムとは?

調理器具

包丁(sort)、おろし器(transform)、ふるい(filter)。素材(データ)に最適な道具がある。

Common Algorithms
#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: ranges
bool found = std::ranges::contains(vec, target);

Ranges (C++20)

ranges::views Pipeline
// 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を全て大文字に変換してください。

次のステップ