当前位置: 首页 > news >正文

【C++取经之路】lambda和bind

目录

引言

lambda语法

lambda捕获列表解析

1)值捕获

2)引用捕获

3)隐式捕获

lambda的工作原理

lambda进阶用法

泛型lambda

立即调用 

lambda 与 function

bind语法

bind的调用逻辑 

bind核心用途

绑定参数

调整参数顺序

bind的陷阱

bind绑定成员函数

结语


引言

Lambda 是现代 C++(C++11 及之后)引入的核心特性,它使得定义匿名函数(即未命名的代码块)更加便捷,尤其是在需要临时传递函数逻辑时,在写算法题时经常用到,就比如sort默认的排序逻辑(升序)不是我们想要的,我们想要的是降序排列,那么给sort传递一个lambda来排序就很方便。

bind是C++11 标准库中的一个关键工具,可以把它看做是一个函数适配器,它接受一个可调用对象,然后生成一个新的可调用对象来适配原对象的参数列表。

光说概念很抽象,下面会举例子来说明。

lambda语法

[ 捕获列表 ] ( 参数列表 ) -> 返回类型 { 函数体 }

可以看到,lambda表达式主要由5个部分组成。除了捕获列表和函数体,其他的都可以忽略。下面是一个简单的lambda表达式,主要是用来熟悉它的语法。

	auto lambda = [](int a, int b) {return a + b; };cout << lambda(1, 2);//输出3

上述的lambda表达式中,捕获列表为空,参数列表有两个,调用时传入,和普通函数调用传参一样,并没什么特别的,返回类型省略了,因为这种情况下它可以自己推导返回类型。具体什么情况下不能省略这里就不列举啦,当省略后编不过在把返回类型加上即可。总之,规范使用可以避免很多不必要的麻烦。

lambda捕获列表解析

lambda表达式中,最值得谈的当然是它的捕获列表啦。

捕获方式

语法

效果

按值捕获

[x]

复制外部变量 x 的值到 Lambda 对象中

按引用捕获

[&x]

引用外部变量 x,Lambda 内修改会影响原变量

捕获全变量(值)

[=]

所有外部变量按值捕获(存在悬挂引用风险,需谨慎!)

捕获全变量(引用)

[&]

所有外部变量按引用捕获(可能无意中修改外部状态,慎用!)

混合捕获

[x, &y]

按值捕获 x,按引用捕获 y

捕获 this

[this] 或 [=]

隐式捕获类的 this 指针,可访问类成员变量

 

可以看到,lambda的捕获方式可谓是花里胡哨,下面谈谈不同捕获方式的区别。

1)值捕获

int main()
{int x = 10;auto lambda = [x](int y) {return x + y; };cout << lambda(20);//输出30return 0;
}

采用值捕获,就是要对捕获的变量进行拷贝,和函数传递参数是采用值传递一样。 只有捕获了该变量才能在lambda的函数体内使用。比如下面的写法就是错误的。

int main()
{int x = 10, t = 30;auto lambda = [x]() {return x + t; };//errorreturn 0;
}

 

采用值捕获时,还有一个细节,就是lambda函数体内部不能修改通过值捕获进来的变量。 以下是个错误示范。

int main()
{int x = 10;auto lambda = [x]() {return x++; };//errorreturn 0;
}

如果非要修改,也是有办法的。介绍一个关键字——mutable。

int main()
{int x = 10;auto lambda = [x]()mutable {return x++; };//正确return 0;
}

 在参数列表后加上mutable关键字即可。

2)引用捕获

int main()
{int x = 10;auto lambda = [&x](int y) {x += 10;return x + y;};lambda(20);cout << x << endl;//输出20return 0;
}

引用捕获和函数采用引用方式传递参数是一个道理,不会进行拷贝,lambda函数体内如果对引用捕获的变量进行修改,外部的也就跟着被修改了,本质上就是修改同一个地址的值。 

在采用引用捕获时需要注意的一点是:一定要注意所引用对象的生命周期,避免出现野指针。这一点和函数调用结束后返回一个局部变量的引用是一样的道理,在函数调用结束后,局部变量就已经被销毁了,这时引用的地址早就被释放了,再去访问程序就该崩了。

3)隐式捕获

除了我们在捕获列表中显示的指出要捕获哪些变量外,也可以让编译器根据lambda函数体中的代码来推断我们需要捕获哪些变量。即编译器自己推导捕获列表。

int main()
{int x = 10;auto lambda = [=](int y) {return x + y; };//采用值捕获的隐式捕获auto lambda = [&](int y) {return x + y; };//采用引用捕获的隐式捕获return 0;
}

当我们混用显示捕获和隐式捕获时,必须把=或&放在第一个,比如这样 [=,&x],还有一点就是明明已经采用隐式的值捕获了,又在捕获列表中采用值捕获其他变量,这是不允许的,也大可不必。比如这么写就是不对的[=,x]。总之,还是那句话——规范使用可以避免很多不必要的麻烦。 

lambda的工作原理

Lambda 在编译时会生成一个匿名类(称为闭包类),其中捕获的变量就会以成员变量的形式存储,然后该闭包类中还重载了调用运算符,也就是重载了()。下面举个例子。

// Lambda: [x](){ return x * 2; }
class __Lambda_123 { // 编译器生成唯一类名
private:int x;  // 捕获的变量
public:__Lambda_123(int x_) : x(x_) {}int operator()() const { return x * 2; }
};

lambda表达式本身就是一个闭包类的实例,也就是闭包类的一个对象。在调用lambda()时,实际上调用的是该闭包类内重载的operator()()函数。 

lambda进阶用法

泛型lambda

以auto作为参数类型。

int main()
{auto print = [](const auto& arg) {cout << arg << endl; };print(20);print("hello world!");return 0;
}

立即调用 

定义后立即执行。

int result = [](int a, int b) { return a + b; }(3, 4); // result = 7

lambda 与 function

function是一个函数包装器,它可以将不同形式的可调用对象(如 Lambda、函数指针等)封装到同一类型中。

function<int(int, int)> func = [](int a, int b) {return a + b; };

关于lambda就说到这啦,下面谈谈bind。

bind语法

#include <functional>  // 必须包含的头文件auto bound_fn = std::bind(FuncPointer,      // 原始函数指针/可调用对象Arg1, Arg2, ...,  // 绑定的参数(可包含占位符)ArgN
);

下面提供个简单代码来熟悉bind的语法。

#include <iostream>
#include <functional>
using namespace std;int Sum(int a, int b){return a + b;}
int main()
{auto boundSum = bind(Sum, 10, placeholders::_1);cout << boundSum(20);//输出30return 0;
}

bind的调用逻辑 

auto boundSum = bind(Sum, 10, placeholders::_1);

bind预先把10绑定到了Sum的第一个参数上,Sum(10, placeholders::_1),placeholders::_1是调用的时候传进来的参数。bind还会把参数拷贝给新的调用对象boundSum,所以如果bind中的有的参数不允许拷贝(输入输出流),那么只能用引用,调用库函数ref,ref(ostream)传递。

bind核心用途

绑定参数

void printSum(int a, int b) { std::cout << a + b << "\n"; 
}// 绑定a=10,剩下参数由调用时提供
auto boundPrint = std::bind(printSum, 10, std::placeholders::_1);boundPrint(20); // 输出 30(等价于 printSum(10,20))

这段代码就是绑定了printSum的第一个参数,第二个参数调用时在传进来。

调整参数顺序

//f是一个可调用对象,它有5个参数
auto g = bind(f, a, b, placeholders::_2, c, placeholders::_1);

f的第一个、第二个和第四个参数被绑定到了a、b、c上。调用g时,假设这样调用g(X, Y),那么会调用 f (a,b,Y,c,X)。这样子参数顺序就变了。所以占位符的作用顾名思义,就是占着那个坑,调用传参的时候在用参数替代掉占位符。 这里不仅体现了bind可以改变参数顺序的作用,还体现出了——可以把bind看做是一个函数适配器,它接受一个可调用对象,然后生成一个新的可调用对象来适配原对象的参数列表(引言中的抽象概念)。f 原本是需要5个参数的,bind之后,生成的新的可调用对象g就只需要传递两个参数。

bind的陷阱

#include <iostream>
#include <functional>
using namespace std;class MyClass
{
public:int Method(int y){_x += 10;return _x + y;}
private:int _x = 10;
};
int main()
{MyClass *obj = new MyClass();auto boundMethod = bind(&MyClass::Method, obj, 10);delete obj;//!!!boundMethod();//未定义行为return 0;
}

通过上面的代码,想说明的一点是:一定要注意对象的生命周期。

bind绑定成员函数

比起绑定普通的函数,bind在绑定成员函数时有更多的细节,稍不注意就写错了,得不到期望的结果。

成员函数和普通函数之间,成员函数多了一个this指针,它不能独立于对象存在,必须指明它是哪个对象的成员函数。

MyClass obj;
1) auto boundMethod = bind(MyClass::Method, obj, 10);
2) auto boundMethod = bind(&MyClass::Method, obj, 10);
3) auto boundMethod = bind(&MyClass::Method, &obj, 10);

4) auto boundMethod = bind(&MyClass::Method, ref(obj), 10);

下面着重讲讲上面这四种写法的区别。

1)第一种写法,是错误的。 但是这么写 bind(&MyClass::Method, obj, 10); 又是对的。原因在于bind的第一个参数是函数指针或者可调用对象,但是单纯只有类名+函数名MyClass::Method并不是函数地址。因为C++语法规定,成员函数指针必须通过&类名::成员函数名的方式获取,这和普通函数不一样。比如普通函数func,在使用func时会被隐式转换为函数指针,但是成员函数不会。所以第一种写法是错误的,&符号必须得加上。

2)第二种写法和第三种写法的区别在于有没有对obj取地址,我们知道,bind是会对参数进行拷贝的,如果采用第二种写法,那么在调用boundMethod的时候,调用的是拷贝后的obj对象里的Method,所做的修改不会影响原对象obj。并不是说这种写法是不对的,但是可能这不是我们想要的结果。

3)第三种写法就是对obj取地址,这样bind内部直接使用的是原来的obj对象,Method方法里做的修改在原obj中可以看到。

4)第四种写法就是对obj的引用,bind内部直接绑定到原始对象obj,Method方法里做的修改在原obj中也可以被看到。

传递方式

含义

示例

按值传递对象 obj

生成一个 obj 拷贝,绑定到拷贝后的对象(可能导致状态不一致)

std::bind(&MyClass::Method, obj, ...)

按引用传递 std::ref(obj)

绑定到原始对象,但需确保对象生命周期在调用时有效

std::bind(&MyClass::Method, std::ref(obj), ...)

按指针传递 &obj

直接使用指针指向的原始对象

std::bind(&MyClass::Method, &obj, ...)

结语

引用一位大佬的一句话——“Use lambdas if you can, and std::bind if you must.这句话出自 Scott Meyers 的经典著作《Effective Modern C++》,书中明确指出:与 std::bind 相比,lambda 几乎在所有方面更优越。


感谢支持!

相关文章:

【C++取经之路】lambda和bind

目录 引言 lambda语法 lambda捕获列表解析 1&#xff09;值捕获 2&#xff09;引用捕获 3&#xff09;隐式捕获 lambda的工作原理 lambda进阶用法 泛型lambda 立即调用 lambda 与 function bind语法 bind的调用逻辑 bind核心用途 绑定参数 调整参数顺序 bind的…...

AF3 ProteinDataset类的初始化方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类主要负责从结构化的蛋白质数据中构建一个可供模型训练/推理使用的数据集,ProteinDataset 类的 __init__ 方法用于初始化一个蛋白质数据集对象。 源代码: def __init__(self,dataset_folder,features_folder="./data/t…...

博客园账户注册全流程指南(附常见问题)

博客园账户注册全流程指南&#xff08;附常见问题&#xff09; 引言 博客园作为国内老牌技术社区&#xff0c;是程序员们分享知识、交流技术的圣地。本文将手把手教你完成从注册到开通博客的全流程&#xff0c;附常见问题解答&#xff0c;助你轻松开启技术博客之旅。 一、注…...

算法复习笔记

算法复习 最大公约数枚举abc反序数 模拟xxx定律打印数字菱形今年的第几天&#xff1f;vector完数VS盈数剩下的树 排序和查找顺序查找二分查找找位置 字符串统计单词浮点数加法 线性数据结构队列约瑟夫问题&#xff08;队列&#xff09;计算表达式&#xff08;栈&#xff09; 递…...

spring boot 引入fastjson,com.alibaba.fastjson不存在(Springboot-测试项目)

spring boot 引入fastjson&#xff0c;com.alibaba.fastjson不存在&#xff08;Springboot-测试项目&#xff09; 先解决最初的的包不找到问题&#xff0c;适用所有包找不到跟进。 <mirrors><!-- mirror| Specifies a repository mirror site to use instead of a g…...

新闻推荐系统(springboot+vue+mysql)含万字文档+运行说明文档

新闻推荐系统(springbootvuemysql)含万字文档运行说明文档 该系统是一个新闻推荐系统&#xff0c;分为管理员和用户两个角色。管理员模块包括个人中心、用户管理、排行榜管理、新闻管理、我的收藏管理和系统管理等功能。管理员可以通过这些功能进行用户信息管理、查看和编辑用…...

UE4 踩坑记录

1、Using git status to determine working set for adaptive non-unity build 我删除了一个没用的资源&#xff0c;结果就报这个错&#xff0c;原因就是这条命令导致的&#xff0c; 如果这个项目是git项目&#xff0c; ue编译时会优先通过 git status检查哪些文件被修改&#…...

【解决方案】vscode 不小心打开了列选择模式,选择时只能选中同一列的数据。

vscode 不小心打开了列选择模式&#xff0c;选择时只能选中同一列的数据。 解决方案&#xff1a; 1.通过命令面板关闭&#xff1a; 按下 Ctrl Shift P&#xff08;Windows/Linux&#xff09;或 Cmd Shift P&#xff08;macOS&#xff09;&#xff0c;输入 切换列选择模式…...

国标GB28181视频平台EasyCVR如何搭建汽车修理厂远程视频网络监控方案

一、背景分析 近年我国汽车保有量持续攀升&#xff0c;与之相伴的汽车保养维修需求也逐渐提高。随着社会经济的发展&#xff0c;消费者对汽车维修服务质量的要求越来越高&#xff0c;这使得汽车维修店的安全防范与人员管理问题面临着巨大挑战。 多数汽车维修店分布分散&#…...

【Go】windows下的Go安装与配置,并运行第一个Go程序

【Go】windows下的Go安装与配置&#xff0c;并运行第一个Go程序 安装环境&#xff1a;windows10 64位 安装版本&#xff1a;go1.16 windows/amd64 一、安装配置步骤 1.到官方网址下载安装包 https://golang.google.cn/dl/ 默认情况下 .msi 文件会安装在 c:\Go 目录下。可自行配…...

Linux 线程:从零构建多线程应用:系统化解析线程API与底层设计逻辑

线程 线程的概述 在之前&#xff0c;我们常把进程定义为 程序执行的实例&#xff0c;实际不然&#xff0c;进程实际上只是维护应用程序的各种资源&#xff0c;并不执行什么。真正执行具体任务的是线程。 那为什么之前直接执行a.out的时候&#xff0c;没有这种感受呢&#xf…...

榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案

无人共享经济下的技术革新 随着无人值守经济模式的快速发展,传统共享设备面临管理成本高、效率低下等问题。榕壹云无人共享系统依托SpringBoot+MySQL+UniApp技术栈,结合物联网与移动互联网技术,为商家提供低成本、高可用的无人化运营解决方案。本文将详细解析该系统的技术架…...

技术书籍推荐(002):电子书免费下载

20. 利用Python进行数据分析 免费 电子书 PDF 下载 书籍简介&#xff1a; 本书聚焦于使用Python进行数据处理和分析。详细介绍了Python中用于数据分析的重要库&#xff0c;如NumPy&#xff08;提供高效的数值计算功能&#xff0c;包括数组操作、数学函数等&#xff09;、panda…...

安全序列(DP)

#include <bits/stdc.h> using namespace std; const int MOD1e97; const int N1e65; int f[N]; int main() {int n,k;cin>>n>>k;f[0]1;for(int i1;i<n;i){f[i]f[i-1]; // 不放桶&#xff1a;延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…...

数据可视化 —— 堆形图应用(大全)

一、案例一&#xff1a;温度堆积图 # 导入 matplotlib 库中的 pyplot 模块&#xff0c;这个模块提供了类似于 MATLAB 的绘图接口&#xff0c; # 方便我们创建各种类型的可视化图表&#xff0c;比如折线图、柱状图、散点图等 import matplotlib.pyplot as plt # 导入 numpy 库&…...

利用 pyecharts 实现地图的数据可视化——第七次人口普查数据的2d、3d展示(关键词:2d 、3d 、map、 geo、涟漪点)

参考文档&#xff1a;链接: link_pyecharts 官方文档 1、map() 传入省份全称&#xff0c;date_pair 是列表套列表 [ [ ],[ ] … ] 2、geo() 传入省份简称&#xff0c;date_pair 是列表套元组 [ ( ),( ) … ] 1、准备数据 population_data&#xff1a;简称经纬度 population_da…...

字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎

当 “AI 自动化” 成为科技领域最炙手可热的关键词&#xff0c;我们仿佛置身于一场激动人心的变革前夜。各行各业都在翘首以盼&#xff0c;期待 AI 技术能够真正解放生产力&#xff0c;将人类从繁琐重复的工作中解脱出来。在这个充满无限可能的时代&#xff0c;字节跳动悄然发布…...

第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题

文章目录 1 幸运数题目描述&#xff1a;答案&#xff1a;4430091 代码&#xff1a; 2 有奖问答题目描述&#xff1a;重点&#xff1a;答案&#xff1a;8335366 代码&#xff1a; 3 平方差题目描述&#xff1a;思路&#xff1a;数学找规律代码&#xff1a; 4 更小的数题目描述&a…...

springboot+tabula解析pdf中的表格数据

场景 在日常业务需求中&#xff0c;往往会遇到解析pdf数据获取文本的需求&#xff0c;常见的做法是使用 pdfbox 来做&#xff0c;但是它只适合做一些简单的段落文本解析&#xff0c;无法处理表格这种复杂类型&#xff0c;因为单元格中的文本有换行的情况&#xff0c;无法对应到…...

静态链接part1

比较多这一部分&#xff0c;包含了编译和链接&#xff0c;书还没看完就先记录一下其中编译的一部分 编译 gcc编译分为预处理、编译、汇编、链接四个步骤 预处理 也称预编译&#xff0c;主要处理的是源代码文件中以“#”开始的预编译指令&#xff0c;这里简单讲一下规则&…...

golang通过STMP协议发送邮件功能详细操作

一.简介 在 Go 语言中接入 IMAP 和 SMTP 服务来进行邮件的发送和接收操作,可以通过使用一些现有的第三方库来简化操作,常见的库有 go-imap 和 gomail&#xff0c;它们可以帮助我们连接和操作 IMAP 邮箱&#xff08;读取邮件&#xff09;以及通过 SMTP 发送邮件 二.实现 1. IMA…...

分布式锁在秒杀场景中的Python实现与CAP权衡

目录 一、分布式锁的前世今生 二、秒杀系统的 “硬核” 挑战 三、Python 实现分布式锁的 “实战演练” Redis 实现:快准狠 ZooKeeper 实现:稳如老狗 数据库实现:老实本分 四、CAP 理论的 “三角恋” 五、性能优化的 “锦囊妙计” 锁粒度控制:粗细有道 超时机制:别…...

数据驱动的温暖守护:智慧康养平台如何实现 “千人千面” 的精准照护?

在当今数字化时代&#xff0c;七彩喜智慧康养平台借助数据的力量&#xff0c;正逐步打破传统养老服务模式的局限&#xff0c;实现 “千人千面” 的精准照护。 通过收集、分析和利用大量与老年人相关的数据&#xff0c;这些平台能够深入了解每位老人的独特需求&#xff0c;并据…...

基于SSM的校园美食交流系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

多线程进阶

进阶的内容&#xff0c;就关于线程的面试题为主了&#xff0c;涉及到的内容在工作中使用较少&#xff0c;但面试会考&#xff01;&#xff01;&#xff01; 锁的策略 加锁的过程中&#xff0c;在处理冲突的过程中&#xff0c;涉及到的一些不同的处理方法&#xff0c;此处的锁…...

聊一聊接口测试时遇到第三方服务时怎么办

目录 一、使用 Mock 或 Stub 模拟第三方服务 二、利用第三方服务的沙箱&#xff08;Sandbox&#xff09;环境 三、测试隔离与数据清理 四、处理异步回调 五、容错与异常测试 六、契约测试 在我们进行接口测试时&#xff0c;有的时候会遇到要调用第三方服务即外部的API&am…...

《Python星球日记》第22天:NumPy 基础

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、NumPy 简介1. 什么是 NumPy&#xff1f;为什么使用 NumPy&#xff1f;2. 安…...

Spring Boot 中 Bean 的生命周期详解

Spring Boot 中 Bean 的生命周期详解 一、引言 在 Spring Boot 应用中&#xff0c;Bean 是构成应用程序的基础组件。理解 Bean 的生命周期对于开发高效、稳定的 Spring Boot 应用至关重要。本文将深入探讨 Spring Boot 中 Bean 的完整生命周期过程。 二、Bean 生命周期的基本…...

结构化需求分析:功能、数据与行为的全景建模

目录 前言1 功能模型&#xff1a;数据流图&#xff08;DFD&#xff09;的结构与应用1.1 数据流图的基本构成要素1.2 数据流图的层次化设计1.3 数据流图的建模价值 2 数据模型&#xff1a;ER图揭示数据结构与关系2.1 ER图的基本组成2.2 建模过程与注意事项2.3 数据模型的价值体现…...

OpenCompass模型评估

OpenCompass面向大模型的开源方和使用者&#xff0c; 提供开源、高效、全面的大模型评测开放平台。 一、OpenCompass文档 1.基础安装 使用Conda准备 OpenCompass 运行环境&#xff1a; conda create --name opencompass python3.10 -y conda activate opencompass2. 安装 Op…...

基于51单片机语音实时采集系统

基于51单片机语音实时采集 &#xff08;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 系统由STC89C52单片机ISD4004录音芯片LM386功放模块小喇叭LCD1602按键指示灯电源构成 1.可通过按键随时选择相应的录音进行播…...

NeuroImage:膝关节炎如何影响大脑?静态与动态功能网络变化全解析

膝骨关节炎&#xff08;KOA&#xff09;是导致老年人活动受限和残疾的主要原因之一。这种疾病不仅引起关节疼痛&#xff0c;还会显著影响患者的生活质量。然而&#xff0c;目前对于KOA患者大脑功能网络的异常变化及其与临床症状之间的关系尚不清楚。 2024年4月10日&#xff0c;…...

高级java每日一道面试题-2025年4月01日-微服务篇[Nacos篇]-Nacos集群的数据一致性是如何保证的?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos集群的数据一致性是如何保证的&#xff1f; 我回答: Nacos 集群数据一致性保障机制详解 在 Java 高级面试中&#xff0c;Nacos 集群的数据一致性保障是考察分布式系统核心能力的关键点。以下是 Nacos 通过多种机制和技术确保…...

阿里云 OSS 在 ZKmall开源商城的应用实践

ZKmall开源商城通过深度整合阿里云OSS&#xff08;对象存储服务&#xff09;&#xff0c;构建了高效、安全的文件存储与管理体系&#xff0c;支撑商品图片、用户上传内容等非结构化数据的存储与分发。结合阿里云OSS的技术特性与ZKmall的微服务架构&#xff0c;其实践方案可总结…...

【Linux】线程池与封装线程

目录 一、线程池&#xff1a; 1、池化技术&#xff1a; 2、线程池优点&#xff1a; 3、线程池应用场景&#xff1a; 4、线程池实现&#xff1a; 二、封装线程&#xff1a; 三、单例模式&#xff1a; 四、其他锁&#xff1a; 五、读者写者问题 一、线程池&#xff1a; …...

protobuf的应用

1.版本和引用 syntax "proto3"; // proto2 package tutorial; // package类似C命名空间 // 可以引用本地的&#xff0c;也可以引用include里面的 import "google/protobuf/timestamp.proto"; // 已经写好的proto文件是可以引用 我们版本选择pr…...

linux shell编程之条件语句(二)

目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …...

图论整理复习

回溯&#xff1a; 模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff…...

企业指标设计方法指南

该文档聚焦企业指标设计方法,适用于企业中负责战略规划、业务运营、数据分析、指标管理等相关工作的人员,如企业高管、部门经理、数据分析师等。 主要内容围绕指标设计展开:首先指出指标设计面临的困境,包括权责不清、口径不统一、缺乏标准规范、报表体系混乱、指标…...

AIP-217 不可达资源

编号217原文链接AIP-217: Unreachable resources状态批准创建日期2019-08-26更新日期2019-08-26 有时&#xff0c;用户可能会请求一系列资源&#xff0c;而其中某些资源暂时不可用。最典型的场景是跨集合读。例如用户可能请求返回多个上级位置的资源&#xff0c;但其中某个位置…...

SAP系统控制检验批

问题&#xff1a;同一批物料多检验批问题 现象&#xff1a;同一物料多采购订单同一天到货时&#xff0c;对其采购订单分别收货&#xff0c;导致系统产生多个检验批&#xff0c;需分别请检单、检验报告等&#xff0c;使质量部工作复杂化。 原因&#xff1a;物料主数据质量试图设…...

JavaScript 代码混淆与反混淆技术详解

一、代码混淆&#xff1a;让别人看不懂你的代码 混淆技术就是一种“代码伪装术”&#xff0c;目的是让别人很难看懂你的代码逻辑&#xff0c;从而保护你的核心算法或敏感信息。 1. 变量名压缩 原理&#xff1a;把变量名改成乱码&#xff0c;比如把calculatePrice改成a&#…...

Android studio | From Zero To One ——手机弹幕

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 滚动显示 代码activity_main.xmlactivity_fullscreen.xmlAndroidManife…...

面向对象的需求分析与UML构造块详解

目录 前言1 面向对象的需求分析概述2 UML构造块概述3 UML事物详解3.1 结构事物&#xff08;Structural Things&#xff09;3.2 行为事物&#xff08;Behavioral Things&#xff09;3.3 分组事物&#xff08;Grouping Things&#xff09;3.4 解释事物&#xff08;Annotational T…...

LeetCode 2843.统计对称整数的数目:字符串数字转换

【LetMeFly】2843.统计对称整数的数目&#xff1a;字符串数字转换 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-symmetric-integers/ 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x &#xff0c;如果其前 n 位数字之和与后 n 位数字…...

RocketMQ深度百科全书式解析

​一、核心架构与设计哲学​ ​1. 设计目标​ ​海量消息堆积​&#xff1a;单机支持百万级消息堆积&#xff0c;适合大数据场景&#xff08;如日志采集&#xff09;。​严格顺序性​&#xff1a;通过队列分区&#xff08;Queue&#xff09;和消费锁机制保证局部顺序。​事务…...

A2A与MCP Server:AI智能体协作与工具交互的核心协议对比

A2A与MCP Server&#xff1a;AI智能体协作与工具交互的核心协议对比 摘要 在AI智能体技术爆发式增长的今天&#xff0c;谷歌的A2A协议与Anthropic的MCP协议正在重塑AI系统架构。本文通过协议栈分层模型、企业级架构设计案例及开发者实践指南三大维度&#xff0c;揭示二者在AI生…...

如何将网页保存为pdf

要将网页保存为PDF&#xff0c;可以按照以下几种方法操作&#xff1a; 1. 使用浏览器的打印功能 大多数现代浏览器&#xff08;如Chrome、Firefox、Edge等&#xff09;都支持将网页保存为PDF文件。步骤如下&#xff1a; 在 Google Chrome 中&#xff1a; 打开你想保存为PDF…...

位运算与实战场景分析-Java代码版

一、为什么每个程序员都要掌握位运算&#xff1f; 在电商秒杀系统中&#xff0c;位运算可以快速判断库存状态&#xff1b;在权限管理系统里&#xff0c;位运算能用极小的空间存储复杂权限配置&#xff1b;在算法竞赛中&#xff0c;位运算更是高频出现的性能优化利器。这项看似…...

【“星睿O6”AI PC开发套件评测】+ Debian 系统安装及 sysbench 跑分对比

很荣幸这次可以得到机会评测 “星睿O6”AI PC开发套件。第一篇文章&#xff0c;我将分为两个部分&#xff1a; 官方 Debian 系统安装到 NVMEsysbench 跑分以及对比 RK3568 和 I712700KF 正文开始之前&#xff0c;忍不住还是想放几张开箱照片&#xff0c;板子实在是太精致了。…...