核心差異速覽
| 特性 | for_each | transform |
| 速度 | 快(引用傳參,原地修改) | 較慢(傳值+返回值,需寫回) |
| 靈活度 | 單區間,只能修改元素 | 雙區間,可異構轉換、多對一 |
| 適用場景 | 單區間就地修改 | 區間轉換、兩區間運算、輸出到不同容器 |
代碼對比實驗
#include
#include
#include
using namespace std;
// for_each:引用參數,原地修改
void square_ref(int& x) { x = x * x; }
// transform:傳值參數,返回結果
int square_val(int x) { return x * x; }
int main() {
vector a(9), b(9);
iota(a.begin(), a.end(), 1);
iota(b.begin(), b.end(), 1);
// for_each
for_each(a.begin(), a.end(), square_ref);
// transform
transform(b.begin(), b.end(), b.begin(), square_val);
// 輸出驗證
for (int v : a) cout << v << ' '; cout << endl;
for (int v : b) cout << v << ' '; cout << endl;
return 0;
}

選擇指南
- 單區間、就地修改、追求極致速度 →
for_each + 引用參數。
- 需要轉換型別、輸出到不同容器、兩區間運算、保留原資料 →
transform。
- 現代 C++ 亦可考慮範圍-based for 迴圈或
std::ranges(C++20)獲得更佳表達力。