Lambda表达式

Lambda表达式

Lambda表达式与仿函数

  • Lambda表达式是C++11时引入的特性

  • Lambda的本质是一个特殊的、匿名的类类型。它是一个带有 operator()​ 的类,即仿函数

    • 仿函数(functor),就是使一个类的使用看上去像一个函数,其实现就是类中实现一个 operator()​ ,这个类就有了类似函数的行为,就是一个仿函数类了
#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; });
}
posted @ 2023-10-03 19:31  天空之城00  阅读(25)  评论(0)    收藏  举报