Lambda表达式
Lambda表达式
Lambda表达式与仿函数
-
Lambda表达式是C++11时引入的特性
-
Lambda的本质是一个特殊的、匿名的类类型。它是一个带有
operator() 的类,即仿函数- 仿函数(functor),就是使一个类的使用看上去像一个函数,其实现就是类中实现一个
operator() ,这个类就有了类似函数的行为,就是一个仿函数类了
- 仿函数(functor),就是使一个类的使用看上去像一个函数,其实现就是类中实现一个
#include<iostream>
class AddNum {
public:
AddNum(int num) : num_(num) {};
//int addNum(int x) const {
// return num_ + x;
//}
int operator() (int x) const {
return num_ + x;
}
private:
int num_;
};
int main()
{
// 仿函数 functor
auto add_num = AddNum(10);
//auto x = add_num.addNum(5);
auto x = add_num(5);
std::cout << "x:" << x << std::endl;
// Lambda
auto add_num2 = [lambda_num = 10](int x){return lambda_num + x;};
auto lambda_x = add_num2(5);
std::cout << "lambda_x:" << lambda_x << std::endl;
}
Lambda 表达式的基本用法
[capture](params) -> ret { body; };
- capture 捕获列表
- params 参数表
- ret 返回值类型
- body 函数体
捕获列表:
-
[] :表示不捕获任何变量-
[=] :表示按值捕获变量,默认使用const 关键字修饰,表达式内部不能对变量进行修改;如需修改,则使用mutable 关键字-
[&] :表示按引用捕获变量,表达式内部可以对变量进行修改
#include <iostream>
int main()
{
int res = [](int x)->int{
return ++x;
}(3);
std::cout << "res: " << res << std::endl;
}
以上方式定义Lambda表达式只能在这一处使用它,如果想要在多处地方使用,可以使用 function 对其进行存储。
#include <iostream>
int main()
{
std::function<int(int)> func = [](int x)->int{
return ++x;
};
func(1);
for (int i = 0; i < 10; i++) {
std::cout << func(i) << std::endl;
}
}
可以使用 auto 关键字自动推导 function 的类型,在C++11中,Lambda表达式的返回值定义可以省略,编译器回自动推导返回值的类型。
#include <iostream>
int main()
{
auto func = [](int x){
return ++x;
};
func(1);
for (int i = 0; i < 10; i++) {
std::cout << func(i) << std::endl;
}
}
for_each 函数模板
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while(first != last)
{
fn (*first);++first;
}
return fn; // or since C++11: return move(fn);
}
#include <iostream>
#include <vector>
#include <algorithm>
//void print_arr (int x)
//{
// std::cout << "x: " << x << std::endl;
//}
struct printArr {
void operator() (int x) {
std::cout << "x: " << x << std::endl;
}
}print_arr;
int main()
{
std::vector<int> arr = {1, 3, 5, 7, 9};
//std::for_each(arr.begin(), arr.end(), print_arr);
int multiplier = 2;
std::for_each(arr.begin(), arr.end(), [multiplier](int x){ std::cout << "x: " << x * multiplier << std::endl; });
}

浙公网安备 33010602011771号