#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main() {
std::vector<int> vec;
int i;
while (std::cin >> i) vec.push_back(i);
// 嘗試將每個元素乘以 2
std::for_each(vec.begin(), vec.end(),
std::bind(std::multiplies<int>(), std::placeholders::_1, 2));
// 輸出結果
std::for_each(vec.begin(), vec.end(),
[](int a){ std::cout << a << " "; });
}
輸出的數值並未變為 2 倍,改用 Lambda 表達式 [](int a){ a = a * 2; } 同樣無效。
std::for_each 的一元操作接受的是元素的副本(傳值),而非引用。無論是 std::bind 產生的函數物件,還是 Lambda,若參數類型為 T 而非 T&,修改只會影響副本,不會寫回容器。
// 方法 1:Lambda 使用引用參數
std::for_each(vec.begin(), vec.end(), [](int &a){ a *= 2; });
// 方法 2:使用 std::transform 並寫回原容器
std::transform(vec.begin(), vec.end(), vec.begin(),
std::bind(std::multiplies<int>(), std::placeholders::_1, 2));
// 方法 3:範圍 for 循環(C++11 以降最簡潔)
for (auto &x : vec) x *= 2;
for_each 只保證遍歷,不保證可修改元素,除非操作接受引用。transform 專為「轉換並寫回」設計,輸出迭代器可指向原容器。理解「傳值 vs 傳引用」與演算法語義差異,能避免此類看似合法實則無效的代碼。