Lambda表达式是C++11的新特性,是一种匿名函数,一般用于小型的函数,比如:
#include <iostream>
#include <algorithm>
void display(int a)
{
std::cout<<a<<" ";
}
int main() {
int arr[] = { 1, 2, 3, 4, 5 };
std::for_each(arr, arr + sizeof(arr) / sizeof(int), &display);
std::cout << std::endl;
}
上面是使用函数指针输出一个数组的所有元素,如果使用Lambda表达式,则可:
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 1, 2, 3, 4, 5 };
std::for_each(arr, arr + sizeof(arr) / sizeof(int), [](int x) {
std::cout<<x<<" ";
});
std::cout << std::endl;
}
这样看起开就比较简练。
一、Lambda表达式基本形式
[](param) -> return_value{
code...
}
其中[]
里是捕捉的参数,()
内是函数的参数,->
后面是函数的返回值,一般可以省略,Lambda表达式会自动推导。
二、Lambda表达式捕捉变量
[]
用于捕捉当前上下文的变量,比如:
#include <iostream>
#include <string>
int main(int argc, char **argv)
{
std::string msg = "Hello";
int counter = 10;
//按值传递两个参数msg,counter
auto func = [msg, counter] () mutable {
std::cout<<"Inside Lambda :: msg = "<<msg<<std::endl;
std::cout<<"Inside Lambda :: counter = "<<counter<<std::endl;
msg = "Temp";
counter = 20;
std::cout<<"Inside Lambda :: After changing :: msg = "<<msg<<std::endl;
std::cout<<"Inside Lambda :: After changing :: counter = "<<counter<<std::endl;
};
//调用匿名函数
func();
std::cout<<"msg = "<<msg<<std::endl;
std::cout<<"counter = "<<counter<<std::endl;
return 0;
}
而按引用传值的形式如下:
auto func = [&msg, &counter] () {
//...
};
此外:
-
[=]
表示捕捉所有上下文变量,并按值传递 -
[&]
表示捕捉所有上下文变量,并引用传递
当然也可以混合传递:
auto func = [=, &counter] () mutable {};
三、Lambda表达式捕捉类的成员变量
假如类的成员函数用到类的成员变量,则需要捕捉this指针:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
class OddCounter
{
int mCounter = 0;
public:
int getCount()
{
return mCounter;
}
void update(std::vector<int> & vec)
{
// this is captured by value inside lambda
std::for_each(vec.begin(), vec.end(), [this](int element){
if(element % 2)
mCounter++; // Accessing member variable from outer scope
});
}
};
网友评论