lambda函数

基本形式

image

例子 :

int a = 1 ;
auto f = [&](int x,int y) -> int { //也可以将 "-> int"去除 , 加 auto 之后会自己判断类型
	return x + y + a;
}

f(1 , 2) ; // 4

[&] : 所有封闭范围内的变量 , 引用捕获 , 可以修改 (在函数定义之前)
[=] : 所有封闭范围内的变量 , 按值捕获 , 不可以修改


递归的两种形式

lambda 函数在形式上不能自己调用自己 , 所以需要特殊的写法引用

function 函数

	std::function<void(int,int)> dfs = [&](int x,int fa) {
		int cnt = 0;
		for(auto y : adj[x]) {
			if(y == fa) continue;
			++cnt;
			dfs(y , x);
			leaf[x] += leaf[y];
		}
		if(!cnt) leaf[x] = 1;
	};

//注意此时就没有了 " -> 返回类型了 ".

加入"自己"参数


	auto dfs = [&](auto self,int x,int fa) -> void { //有 " -> 返回类型了 "
		int cnt = 0;
		for(auto y : adj[x]){
			if(y == fa) continue;
			++cnt;
			self(self , y , x); //注意这里是 "self" 
			leaf[x] += leaf[y];
		}
		if(!cnt) leaf[x] = 1;
	};
	

lambda 中调用 lambda

	auto is_prime = [&](int x) {
		if(x == 1) return false;
		for(int i = 2 ; i * i <= x; ++i)
			if(x % i == 0) return false;
		return true;	
	} ;
	
	auto func = [&](int n) {
		for(int i = 1 ; i <= n ; ++i)
			if(is_prime(i)) std::cout << i << ' ';
	} ; 
	
	func(20); //2 3 5 7 11 13 17 19

posted @ 2023-07-01 14:17  xqy2003  阅读(103)  评论(0)    收藏  举报