所在的位置: C++ >> C++介绍 >> C11新特性34lambda表

C11新特性34lambda表

可变lambda

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

vectorintscore{45,70,56,86,28,60,90};

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

find_if(score.begin(),score.end(),

[](intv){return(v=60);});

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

intcounter=2;

find_if(score.begin(),score.end(),

[counter](intv){

return(v=60)(--counter==0);

});

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

intcounter=2;

autoiter=find_if(score.begin(),score.end(),

[counter](intv)mutable{

return(v=60)(--counter==0);

});

cout*iterendl;

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

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

作者观点

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




转载请注明:http://www.aierlanlan.com/rzfs/3557.html