秋雨De blog

  • 首页
  • 留言板
  • 关于
  • rss
秋雨De blog
一个技术小白的个人博客
  1. 首页
  2. C++
  3. 正文

c++ lambda表达式

2020年8月10日 5148点热度 0人点赞 2条评论

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

lambda表达式格式

这里引用一下:CSDN博主thinkerleo7798的C++中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的使用方法,这是一个相当好用的一个表达式希望可以用更多方便的用法

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020年8月10日

fallrain

种一棵树最好的时间是十年前,其次是现在。

点赞
下一篇 >

文章评论

  • 踏雪飞鸿

    来一起友情链接呀。。

    2023年4月6日
    回复
    • fallrain

      @踏雪飞鸿 已添加

      2023年4月7日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    fallrain

    种一棵树最好的时间是十年前,其次是现在。

    文章目录
    • lambda表达式格式
    • lambda表达式基本用法
    • lambda表达式在sort中的使用
    • 我们还可以用lambda替换函数指针
    • 我们还可以通过Lambda组合多个函数
    友情连接
    猫饭范文泉博客迎風别葉CODING手艺人ScarSu
    归档
    • 2025 年 4 月
    • 2025 年 3 月
    • 2024 年 12 月
    • 2024 年 10 月
    • 2024 年 5 月
    • 2023 年 2 月
    • 2022 年 11 月
    • 2022 年 3 月
    • 2021 年 12 月
    • 2021 年 8 月
    • 2021 年 5 月
    • 2021 年 4 月
    • 2021 年 3 月
    • 2020 年 12 月
    • 2020 年 11 月
    • 2020 年 8 月
    • 2020 年 5 月
    • 2019 年 12 月
    • 2019 年 3 月

    吉ICP备18007356号

    吉公网安备22020302000184号

    Theme Kratos Made By Seaton Jiang

    COPYRIGHT © 2025 秋雨De blog ALL RIGHTS RESERVED