lamda表达式

Posted osbreak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lamda表达式相关的知识,希望对你有一定的参考价值。

C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。

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

lambda表达式的语法如下所示:
[capture_block](parameters) exceptions_specification -> return_type {body}
[捕捉快](参数) 异常 -> 返回值类型 {主体}
 
 
范例一:
技术分享图片
1 []{std::cout<<"Hello from Lambda!"<<std::endl;}();
2 输出如下所示:
3 Hello from Lambda
4 在控制台输出Hello from Lambda,尾部的括号使该表达式可立即执行。
View Code

 

 
范例二:
技术分享图片
1 std::string result=[](const std::string& str)->std::string{return "Hello from "+str;}("second Lambda");
2 std::cout<<result<<std::endl;
3 输出如下所示:
4 Hello from second Lambda
5 该lambda表达式接受一个string参数并返回一个string,结果保存在变量result中,尾部的括号使得该表达式立即执行。
View Code

 

 
范例三:
技术分享图片
1 auto fn=[](const std::string& str) {return "Hello from "+str;};
2 std::cout<<fn("call 1")<<std::endl;
3 std::cout<<fn("call 2")<<std::endl;
4 输出如下所示:
5 Hello from call 1
6 Hello from call 2
7 此处保存指向lambda表达式的指针,并且通过函数指针执行该表达式。
View Code

 

 
范例四:(STL与lambda)
技术分享图片
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4  
 5 auto main(int argc, char** argv) -> int
 6 {
 7     std::vector<int> vec={1, 2, 3, 4, 5, 6, 7, 8, 9};
 8     int value=3;
 9     int cnt=std::count_if(vec.cbegin(), vec.cend(), [=](int i){return i>value;});
10     std::cout<<"Found "<<cnt<<" values > "<<value<<std::endl;
11  
12     return 0;
13 }
14 输出如下所示:
15 Found 6 values > 3
16 通过count_if算法计算vector中满足特定条件的元素个数,lambda表达式的形式给出了条件,注意表达式中的=,等号表示通过值捕捉所在作用域的变量,这个例子中捕捉的是value的值。前面的例子[]为空,即捕捉块为空,那么在lambda表达式的主体body内就无法访问变量了。以下是关于捕捉块的详细介绍:
17 [=]通过值捕捉所有变量
18 [&]通过引用捕捉所有变量
19 [value]通过值捕捉value,不捕捉其它变量
20 [&value]通过引用捕捉value,不捕捉其它变量
21 [=, &value]默认通过值捕捉,变量value例外,通过引用捕捉
22 [&, value]默认通过引用捕捉,变量value例外,通过值捕捉
View Code

 

 
范例五:(STL与lambda结合)
技术分享图片
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4  
 5 auto main(int argc, char** argv) -> int
 6 {
 7     std::vector<int> vec={11, 22, 33, 44};
 8     int index=0;
 9     for_each(vec.begin(), vec.end(), 10              [&index](int i){std::cout<<"Value "<<(index++) 11              <<": "<<i<<std::endl;});
12  
13     return 0;
14 }
15 通过for_each算法可以对给定范围中的所有元素执行特定操作,调用lambda表达式,并将这个值作为参数传递给lambda表达式。
View Code

 

 

以上是关于lamda表达式的主要内容,如果未能解决你的问题,请参考以下文章

Lamda Expression

Java Lamda表达式List 对象去重

Lamda Expression

lamda

《Java 8 实战》—— Lamda

Lamda 表达式