您的位置:首页 > 编程语言 > C语言/C++

C++11新特性lambda表达扫盲篇

2014-04-22 23:23 197 查看
C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解。

lambda表达式的语法如下所示:

[capture_block](parameters) exceptions_specification -> return_type {body}

[捕捉快](参数) 异常 -> 返回值类型 {主体}

以下是关于捕捉块的详细介绍:

[=]通过值捕捉所有变量

[&]通过引用捕捉所有变量

[value]通过值捕捉value,不捕捉其它变量

[&value]通过引用捕捉value,不捕捉其它变量

[=, &value]默认通过值捕捉,变量value例外,通过引用捕捉

[&, value]默认通过引用捕捉,变量value例外,通过值捕捉

下面的例子将逐步演示如何使用lambda表达式:

范例一:

[]{std::cout<<"Hello from Lambda!"<<std::endl;}();

输出如下所示:

Hello from Lambda

在控制台输出Hello from Lambda,尾部的括号使该表达式可立即执行。

范例二:

std::string result=[](const std::string& str)->std::string{return "Hello from "+str;}("second Lambda");

std::cout<<result<<std::endl;

输出如下所示:

Hello from second Lambda

该lambda表达式接受一个string参数并返回一个string,结果保存在变量result中,尾部的括号使得该表达式立即执行。

范例三:

auto fn=[](const std::string& str) {return "Hello from "+str;};

std::cout<<fn("call 1")<<std::endl;

std::cout<<fn("call 2")<<std::endl;

输出如下所示:

Hello from call 1

Hello from call 2

此处保存指向lambda表达式的指针,并且通过函数指针执行该表达式。

范例四:(STL与lambda)

#include <iostream>

#include <algorithm>

#include <vector>

auto main(int argc, char** argv) -> int

{

std::vector<int> vec={1, 2, 3, 4, 5, 6, 7, 8, 9};

int value=3;

int cnt=std::count_if(vec.cbegin(), vec.cend(), [=](int i){return i>value;});

std::cout<<"Found "<<cnt<<" values > "<<value<<std::endl;

return 0;

}

输出如下所示:

Found 6 values > 3

通过count_if算法计算vector中满足特定条件的元素个数,lambda表达式的形式给出了条件,注意表达式中的=,等号表示通过值捕捉所在作用域的变量,这个例子中捕捉的是value的值。前面的例子[]为空,即捕捉块为空,那么在lambda表达式的主体body内就无法访问变量了。

范例五:(STL与lambda结合)

#include <iostream>

#include <algorithm>

#include <vector>

auto main(int argc, char** argv) -> int

{

std::vector<int> vec={11, 22, 33, 44};

int index=0;

for_each(vec.begin(), vec.end(), \

[&index](int i){std::cout<<"Value "<<(index++) \

<<": "<<i<<std::endl;});

return 0;

}

通过for_each算法可以对给定范围中的所有元素执行特定操作,调用lambda表达式,并将这个值作为参数传递给lambda表达式。

范例程序差不多了,在C++11中,官方似乎一直鼓励大家用lambda表达式,而不是函数对象,lambda表达式更易于使用和理解。

原文出处:http://blog.sina.com.cn/s/blog_74a7e56e0101akye.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: