- 论坛徽章:
- 0
|
5可用积分
本帖最后由 zuiwei 于 2012-04-10 18:37 编辑
我定义一个vector,然后循环让每个vector的元素加上2.下面这段代码没有问题(VC2010):
- #include<algorithm>
- #include<iostream>
- #include<iterator>
- #include<string>
- #include<vector>
- using namespace std;
- void main(){
- int add=2;
- vector<int> vi;
- vi.push_back(1);
- vi.push_back(2);
- for_each(vi.begin(),vi.end(),[=](int& i){i+=add;});
- copy(vi.begin(),vi.end(),ostream_iterator<int>(cout,","));
- }
复制代码 程序运行打印3,4
但是如果我把lambda函数改成
for_each(vi.begin(),vi.end(),[&](int i){i+=add;});
那么copy那一行的打印结果就是1,2,说明vector的元素没有被修改
这是为什么呢? 我在声明lambda函数的时候已经用了[&],那么后面的int i就不需要再用引用了吧?
我的想法错在哪里? |
最佳答案
查看完整内容
for_each(beg, end, f)会将[beg,end)的元素依次传递给f: f(*beg)。如果f的参数不是引用, 就达不到修改[beg, end)的目的。所以[ ](int& /*这里必须是引用*/i ){ i += add; } 才能修改vi。lambda表达式中的花括号部分:{ i += add; } 中的i是形式参数, 会以vi的元素作为实际参数调用。而add, 是产生这个lambda表达式的环境中的add, 也就是main 第1行: int add=2;[/*如果这里是*/=], 花括号里的add是第1行的一个复制; [/*如 ...
|