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

可变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表达式捕获值的场景确实不多,以至于想了好半天才想到本文中的例子。



觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/80658832