void print(int& a) { cout << a; }
vector v = {1,2,3};
for_each(v.begin(), v.end(), print); // print 作為一元操作傳遞
// 簡化版 for_each 實現
template
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f) {
for (; first != last; ++first) {
f(*first); // 關鍵:解引用迭代器得到元素 (int&),傳遞給 f
}
return f;
}
// 只讀
for_each(v.begin(), v.end(), [](const int& x) { cout << x << ' '; });
// 修改元素
for_each(v.begin(), v.end(), [](int& x) { x *= 2; });
// C++20 範圍版
for_each(views::all(v), [](int& x) { x *= 2; });
// 只讀
for (const int& x : v) cout << x << ' ';
// 修改
for (int& x : v) x *= 2;
// 查找第一個偶數
auto it = find_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
// 統計大於 5 的個數
int cnt = count_if(v.begin(), v.end(), [](int x) { return x > 5; });
| 形式 | 定義 | 狀態攜帶 | 內聯優化 | 適用場景 |
|---|---|---|---|---|
| 函數指針 | `void (*f)(int&)` | 無 (全局/靜態) | 難 (間接調用) | C 接口、簡單回調 |
| 仿函數 | `struct { void operator()(int&) {} }` | 可攜帶成員變量 | 易 (編譯器可內聯) | STL 經典、需狀態算法 |
| Lambda | `[捕獲](參數){體}` | 捕獲列表攜帶上下文 | 極易 (編譯器極積極內聯) | 現代 C++ 首選、就地邏輯 |
`for_each(v.begin(), v.end(), print)` 中 `print(int& a)` 的引用參數**精確匹配容器元素左值引用**,實現**零拷貝訪問**並**支持修改元素**。現代 C++ 推薦使用 **Lambda** 或 **範圍-based for**,代碼更緊湊、優化更激進、捕獲上下文更靈活。