std::vector<int> v = {1, 5};
int total = 0;
for (int i = 0; i < v.size(); ++i) {
total += v[i];
}
意圖明確,但編譯器難以自動並行化。
int total = 0;
#pragma omp parallel for reduction(+:total)
for (int i = 0; i < v.size(); ++i) {
total += v[i];
}
需掌握 OpenMP 語法,侵入性強。
for_each + 函數對象
class Adder {
int _total = 0;
public:
void operator()(int& i) { _total += i; }
operator int() { return _total; }
};
int total = std::for_each(v.begin(), v.end(), Adder());
樣板代碼過多,僅為求和不值得定義類。
std::vector<int> v = {1, 5};
int total = 0;
std::for_each(v.begin(), v.end(),
[&total](int x) { total += x; }
);
[捕獲列表](參數列表) -> 返回類型 { 函數體 }
[&total]:引用捕獲 total,保證循環後結果可用(int x):參數,對應元素類型{ total += x; }:函數體return 或 void 時自動推導)| 語法 | 含義 |
|---|---|
[=] | 值捕獲所有外部變量 |
[&] | 引用捕獲所有外部變量 |
[x, &y] | 值捕獲 x,引用捕獲 y |
[=, &y] | 默認值捕獲,但 y 引用捕獲 |
[&, x] | 默認引用捕獲,但 x 值捕獲 |
| 場景 | 推薦寫法 |
|---|---|
| 簡單算法(求和、查找、轉換) | std::accumulate/std::transform + lambda |
| 回調/事件處理 | 捕獲 this 或 [=] 綁定成員函數 |
| 線程池任務提交 | pool.enqueue([=]{ doWork(); }); |
| 延遲計算/懶加載 | 返回 lambda 延遲執行 |
shared_ptr[=] 導致拷貝開銷大:大對象顯式引用捕獲或移動捕獲 (C++14 [ptr=std::move(ptr)])std::function 包裝或 C++23 auto f = [&](auto self, int n) { ... self(self, n-1); }mutable 只影響 lambda 內部副本,不影響外部變量Lambda 讓「將計算邏輯作為數據傳遞」變得零成本,配合 STL 算法與並行執行策略,是現代 C++ 寫出高性能、可讀、可維護代碼的關鍵工具。