秋雨 De Blog

一个技术小白的个人博客

c++ lambda表达式

C++11推出了新的lambda表达式(匿名函数),这是相当好用的东西,接下来我将介绍他的几种用法

lambda表达式格式

这里引用一下:CSDN博主thinkerleo7798C++中lambda表达式(匿名函数)的用法

C++中 lambda表达式的语法形式如下:
[ captures list] ( params ) -> ret { body }
翻译:
[ 捕获列表 ] ( 参数列表 ) ->( 返回值类型){ 函数体 }

lambda表达式基本用法


/*返回一个数值*/
int main() {
	auto str = [] {return 54; };
        //auto str = []() -> int {return 54; };这里还可以指定返回值类型为int但也可以不用指定
	cout << str() << endl;//str()会返回一个54
}

/*通过调用来实现一个简短的函数*/
int main() {
	auto str = [](int a, int b) {return a > b ? a : b; };
	cout << str(5,3) << endl;
}

/*
利用[]可以调用外部的变量可以在函数体内使用
[=]   通过值捕捉所有变量
[&]  通过引用捕捉所有变量
[value] 通过值捕捉value,不捕捉其它变量
[&value] 通过引用捕捉value,不捕捉其它变量
[=, &value] 默认通过值捕捉,变量value例外,通过引用捕捉
[&, value] 默认通过引用捕捉,变量value例外,通过值捕捉
*/
int main() {
	int i = 0;
	auto str = [&i]() {
		for (int j = 0; j < 10; j++) i += j;
	};
	str();
	cout << i << endl;
}

lambda表达式在sort中的使用

sort可以通过指定的函数来替换排序的规则


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int sor(int a,int b) {
	return a > b ? a : b;
}

int main() {
	vector<int> a = { 1,2,3,4,5,6,7,8,9,10 };
	sort(a.begin(), a.end(), sor);
	for (auto v : a) cout << v << endl;
}

而当我们引用lambda表达式的时候我们就可以直接这么用


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
	vector<int> a = { 1,2,3,4,5,6,7,8,9,10 };
	sort(a.begin(), a.end(), [](int a, int b) {return a > b ? a : b; });//可以将其放在函数里作为一个函数表达式
	for (auto v : a) cout << v << endl;
}

我们还可以用lambda替换函数指针


#include<iostream>
#include<vector>
using namespace std;


int test1(int i) {
	return i+i;
}

void test(int (*poj)(int)) {
	for (int i = 0; i < 10; i++) {
		cout << poj(i)<<endl;
	}
}

int main() {
	test(test1);
}

这个方法看着挺好,但是当我们有更多的需求的时候就要定义更多的无用函数就会很麻烦,所以这里也可以运用lambda的表达式来做


auto test =[] (auto poj) {//这里也可以使用Lambda来做
	for (int i = 0; i < 10; i++) {
		cout << poj(i) << endl;
	}
};

int main() {
	test([](int i) {return i + i; });
	test([](int i) {return i - i; });
	test([](int i) {return i * i; });
	test([](int i) {return i / i; });
}

我们还可以通过Lambda组合多个函数

这种方法可以用来组合多个通过一个函数来调用多个函数,但如果想要调用其他函数就要重写fun方法


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void str(int &i) {
	cout << i + 10 << endl;
}

void sss(int &i) {
	cout << i - 10 << endl;
}

void fun(int a) {
	str(a);
	sss(a);
}


int main() {
	int srt = 50;
	fun(srt);
}

用函数指针,不够简洁,而且每次都要指定函数参数以及函数的指针


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void str(int i) {
	cout << i + 10 << endl;
}

void sss(int i) {
	cout << i - 10 << endl;
}

void fun(int a,void (*f1)(int),void (*f2)(int)) {
	f1(a);
	f2(a);
}


int main() {
	int srt = 50;
	fun(srt,str,sss);
}

而当我们采用lambda表达式


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void str(int i) {
	cout << i + 10 << endl;
}

void sss(int i) {
	cout << i - 10 << endl;
}


auto fun1 = [](auto f1, auto f2) {
	return [=](int a) {
		f1(a);
		f2(a);
	};
};

int main() {
	int srt = 50;
	auto f= fun1(str, sss);
	f(srt);/*而且这里还可以指定调用的参数,组合完可以当一个函数来调用*/
}

这里是使用C++ lambda的使用方法,这是一个相当好用的一个表达式希望可以用更多方便的用法

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注