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,尾部的括号使该表达式可立即执行。
范例二:
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中,尾部的括号使得该表达式立即执行。
范例三:
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表达式的指针,并且通过函数指针执行该表达式。
范例四:(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例外,通过值捕捉
范例五:(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表达式。
以上是关于lamda表达式的主要内容,如果未能解决你的问题,请参考以下文章