C++11新特性(34)- lambda表达式(5)

时间:2022-11-15 13:54:35


可变lambda


假设有如下vector,保存的内容是学生的考试成绩:


vector<int> score{45, 70, 56, 86, 28, 60, 90};


可以用以下代码来寻找第一个及格成绩:


find_if(score.begin(), score.end(),
[](int v){return (v >=60);});


如果需要找到第n个及格成绩,很自然地会考虑使用下面的代码:


int counter = 2;
find_if(score.begin(), score.end(),
[counter](int v){
return (v >=60)&&(--counter == 0);
});


但 是很遗憾,这时会出现编译错误,告诉你counter是只读的。其原因是因为在lambda表达式中很少有需要修改捕获值的场景,因此默认捕获值具有 const属性。如果出现本例这样,确实希望修改捕获值的情况,C++11使用mutable关键字来解决这个问题。来看完整代码:


int counter = 2;
auto iter find_if(score.begin(), score.end(),
[counter](int v)mutable{
return (v >=60)&&(--counter == 0);
});
cout << *iter << endl;


当然了,由于是值捕获,处于lambda表达式外面的counter值依然不会改变。


如果希望连外面的counter一起修改,使用引用捕获即可。


作者观点


需要改变lambda表达式捕获值的场景确实不多,以至于想了好半天才想到本文中的例子。



关注微信公众号【面向对象思考】

C++11新特性(34)- lambda表达式(5)