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

function包装器的意义

一:function包装器的概念

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。

二:需要function包装器的场景

那么我们来看看,我们为什么需要function呢?
一个需要包装器的场景:
// 包装器
// 函数模板
template<class F, class T>
T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}//一个普通函数
double f(double i)
{return i / 2;
}//一个仿函数
struct Functor
{double operator()(double d){return d / 3;}
};int main()
{// 函数名cout << useF(f, 11.11) << endl;// 函数对象cout << useF(Functor(), 11.11) << endl;// lamber表达式cout << useF([](double d)->double { return d / 4; }, 11.11) << endl;return 0;
}

运行结果:

从这个运行结果,要看出两个点:

①:因为实例化出了三份不同的类型的类,所以conut进行++是互不影响的

②:因为实例化出了三份不同的类型的类,所以count的地址是不同的

Q:为什么这段代码需要包装器 function

A:这段代码演示了 C++ 中不同类型的可调用对象(函数指针、函数对象、Lambda)在模板实例化时实例化出不同类型的行为(模板 useF 会生成多个实例)

Q:那如果我们可能希望 count 共享,也就是说希望 useF 无论传入什么可调用对象,都共享同一个 count,那怎么办呢?

A:这就需要用到function包装器了!

三:function包装器的作用

1:function包装器的书写格式

看图不好理解,直接上例子吧:

比如我们对上面的f函数进行包装,就写成这样就行:

double f(double i)
{return i / 2;
}#include<functional>int main()
{//对f函数进行封装function<double(double)> fc1 = f;return 0;
}

语法解析:

(1) 头文件

#include<functional> // 必须包含此头文件

(2) 声明格式

std::function<返回值类型(参数类型1, 参数类型2, ...)> 变量名;

返回值类型:被包装的可调用对象的返回类型

参数类型:被包装的可调用对象的参数类型(可以有多个)

所以我们对f函数进行包装,才写作如下:

function<double(double)> fc1 = f;

2:对场景进行包装

#include<iostream>
using namespace std;// 包装器
// 函数模板
template<class F, class T>
T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}double f(double i)
{return i / 2;
}struct Functor
{double operator()(double d){return d / 3;}
};#include<functional>int main()
{// 函数指针function<double(double)> fc1 = f;/*fc1(11.11);*/cout << useF(fc1, 11.11) << endl;// 函数对象function<double(double)> fc2 = Functor();//fc2(11.11);cout << useF(fc2, 11.11) << endl;// lambda表达式function<double(double)> fc3 = [](double d)->double { return d / 4; };//fc3(11.11);cout << useF(fc3, 11.11) << endl;return 0;
}

运行结果:

从这个运行结果,要看出两个点:

①:因为实例化出的是一份公共的类,所以conut进行++是互相影响的

②:因为实例化出的是一份公共的类,所以count的地址是相同的

四:用包装器解决逆波兰表达式求值

题目介绍及以前的解法:逆波兰表达式求值-CSDN博客

1:思路对比

a:原本思路:

遇到操作数时,压入栈中;遇到运算符时,弹出栈顶的两个操作数进行运算,计算得到的结果再压入栈;最终栈顶元素即为结果。

b:包装器思路:

map来 创建了一个从字符串(操作符)到对应操作函数的映射。这使得我们可以通过操作符字符串直接查找并调用相应的运算函数。

且map的v值类型是function<int(int,int)>,其用于包装接受两个整数参数并返回一个整数的操作函数;对应的操作函数呢,我们采取lambda表达式,显得简洁;

如图:

map<string, function<int(int,int)>> opFuncMap = {{"+", [](int x, int y){return x + y;}},{"-", [](int x, int y){return x - y;}},{"*", [](int x, int y){return x * y;}},{"/", [](int x, int y){return x / y;}}};

Q:对应的操作函数一定要用lambda表达式吗?

A:不一定,但是lambda一定是最简洁的,以下展示了v值对应的操作函数用其他方法的冗余效果

a:使用普通函数

int add(int x, int y) { return x + y; }
int sub(int x, int y) { return x - y; }
int mul(int x, int y) { return x * y; }
int divi(int x, int y) { return x / y; }map<string, function<int(int,int)>> opFuncMap = {{"+", add},{"-", sub},{"*", mul},{"/", divi}
};

b:使用仿函数

struct Add {int operator()(int x, int y) { return x + y; }
};
struct Sub {int operator()(int x, int y) { return x - y; }
};
// 同理定义Mul和Divmap<string, function<int(int,int)>> opFuncMap = {{"+", Add()},{"-", Sub()},{"*", Mul()},{"/", Div()}
};

解释:

可以看出,不管是普通函数还是仿函数,都需要额外定义函数或类,并不优秀

lambda直接在初始化映射表时完成定义,非常优秀

2:代码

class Solution {
public:int evalRPN(vector<string>& tokens) {// 定义操作符到函数的映射map<string, function<int(int,int)>> opFuncMap = {{"+", [](int x, int y){return x + y;}},{"-", [](int x, int y){return x - y;}},{"*", [](int x, int y){return x * y;}},{"/", [](int x, int y){return x / y;}}};stack<int> st; // 用于存储操作数的栈for(auto& str : tokens) {if(opFuncMap.count(str)) { // 如果是操作符int right = st.top(); st.pop();int left = st.top(); st.pop();st.push(opFuncMap[str](left, right));}else { // 如果是操作数st.push(stoi(str));}}return st.top();}
};

3:代码解读

相比于老方法,我们的设计显得非常的细腻;而不是以前直接暴力判断字符是否为操作字符。

值得再说一句的是,map定义时候:

string是一个类型,而function<int(int,int)>也是一个类型;

string接收"+"这种字符串,而function<int(int,int)>接收[](int x, int y){return x + y;}这样一个lambda

五:包装器的几种用法的格式

1:普通函数的包装

int f(int a, int b) {return a + b;
}// 包装普通函数
function<int(int, int)> fc1 = f;

特点

  • 直接使用函数名 f 赋值给 function

  • 调用方式与原函数完全相同

  • 最简单直接的包装方式

2:静态成员函数的包装

class Plus {
public:static int plusi(int a, int b) {return a + b;}
};// 包装静态成员函数
function<int(int, int)> fc2 = &Plus::plusi;

特点

  • 需要使用 &类名::函数名 的语法获取函数指针(&一定得要,语法规定)

  • 调用方式与普通函数相同

3:非静态成员函数的包装

静态成员函数代码:

class Plus
{
public:double plusd(double a, double b){return a + b;}
};//对其中的plusd函数进行包装

方式一:使用对象值

使用对象值去包装非静态函数的两种写法:写法1:
function<double(Plus, double, double)> fc3 = &Plus::plusd;
//使用的时候,第一个参数匿名构造一个对象
cout << fc3(Plus(), 1, 1) << endl;或者写法2:
Plus plus;
function<double(Plus, double, double)> fc4 = &Plus::plusd;
cout << fc4(plus, 1, 1) << endl;

特点

  • 包装器的第一个参数的类型是类类型(类这个类型),所以是Plus;因为成员函数的第一个参数是this 指针,所以要用类类型Plus去对应

  • 调用时,第一个参数要么是之前实例化的对象(如plus);要么就是匿名构造一个对象(Plus())

方式二:使用对象指针

    //一定要实例化Plus plus;function<double(Plus*, double, double)> fc5 = &Plus::plusd;//第一个参数是堆对象取地址cout << fc5(&plus, 1, 1) << endl;

特点

  • function第一个参数的类型必须是类指针 Plus*

  • 一定需要先创建对象实例 plus

  • 调用时,第一个参数需要传入对象地址 &plus

六:bind绑定对于包装器的优化

bind叫作绑定,有两个作用:

①:更改参数的顺序(不重要)

②:更改参数的个数(重要)

1:更改参数的顺序

int Sub(int a, int b)
{return a - b;
}int main()
{int x = 10, y = 20;cout << Sub(x, y) << endl;  // 正常调用,输出 -10auto f1 = bind(Sub, placeholders::_2, placeholders::_1);//用bind更改参数的顺序后cout << f1(x, y) << endl;   // 输出 10return 0;
}

运行结果:

解释:

  • placeholders是标准库定义的命名空间,位于 <functional> 头文件中。

  • bind(Sub, placeholders::_2, placeholders::_1) 将第二个参数作为第一个参数,第一个参数作为第二个参数()

  • 原本 Sub(10,20) 是 10-20=-10

  • 调整后变为 Sub(20,10) 是 20-10=10

2:更改参数的个数

我们之前五中的例子,对于非静态成员函数的包装后,使用的时候,第一个参数需要传我们不想手动传的东西,如:

cout << fc3(Plus(), 1, 1) << endl;cout << fc4(plus, 1, 1) << endl;cout << fc5(&plus, 1, 1) << endl;

那我们现在就可以用bind,去更改参数的个数,让我们传的时候只传后面的1,1,如下

cout << fc3(1, 1) << endl;
cout << fc4(1, 1) << endl;
cout << fc5(1, 1) << endl;

更改参数个数的代码:

class Plus
{
public:double plusd(double a, double b){return a + b;}
};int main()
{//1:使用对象值绑定 (plus)//原先调用的第一个参数是plus  被省略了Plus plus;function<double(double, double)> fc4 = bind(&Plus::plusd, plus, placeholders::_1, placeholders::_2);cout << fc4(1, 1) << endl;//2:使用临时对象值绑定 (Plus())//原先调用的第一个参数是Plus()  被省略了function<double(double, double)> fc3 = bind(&Plus::plusd, Plus(), placeholders::_1, placeholders::_2);cout << fc3(1, 1) << endl;//3:使用对象指针绑定 (&plus)//原先调用的第一个参数是&plus  被省略了function<double(double, double)> fc5 = bind(&Plus::plusd, &plus, placeholders::_1, placeholders::_2);cout << fc5(1, 1) << endl;return 0;
}

运行结果:

相关文章:

function包装器的意义

一&#xff1a;function包装器的概念 function包装器 也叫作适配器。C中的function本质是一个类模板&#xff0c;也是一个包装器。 二&#xff1a;需要function包装器的场景 那么我们来看看&#xff0c;我们为什么需要function呢&#xff1f; 一个需要包装器的场景&#xff1a…...

【ThinkBook 16+ 电脑重做系统type-c接口部分功能失效解决方案】

ThinkBook 16 电脑重做系统type-c接口部分功能失效解决方案 问题回顾&#xff1a;重做电脑后&#xff0c;type-c接口部分功能失效&#xff0c;充电正常&#xff0c;连接外置硬盘正常&#xff0c;无法连接外拓显示器&#xff0c;显示usbc无信号&#xff08;不同设备可能显示不同…...

【言语理解】中心理解题目之选项分析

front:中心理解题目之结构分析 4.1两出处六有误 两出处 背景、例子、分析论证中提炼的选项出处有误&#xff0c;一般不选但是和因此之前、不是而是 的不是部分、被指代部分提炼的选项出处有误&#xff0c;一般不选。 六有误 片面&#xff1a;原文并列谈论两方面&#xff0c;只…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: [1]如何加载动态链接库, 并无缝支持原生底层开发?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

VTK入门指南

什么是VTK VTK (Visualization Toolkit) 是一个开源的、跨平台的计算机图形学、图像处理和可视化系统。它提供了丰富的算法和高级工具&#xff0c;用于3D计算机图形学、图像处理和可视化。 安装VTK Windows平台 下载预编译版本&#xff1a; 从VTK官网或GitHub发布页面下载 …...

开始一个vue项目-day2

这次新增的功能有&#xff1a; 1、使用cookie存储token 参考网站:https://vueuse.org/ 安装包&#xff1a; npm i vueuse/integrations npm i universal-cookie^7 2、cookie的设置读取和删除&#xff0c;代码&#xff1a;composables/auth.js import { useCookies } from …...

Baklib驱动企业知识管理AI升级

Baklib如何实现知识AI化 Baklib通过构建企业级知识中台的核心能力&#xff0c;将人工智能技术深度融入知识管理的全生命周期。其底层架构采用自然语言处理&#xff08;NLP&#xff09;与机器学习算法&#xff0c;实现对企业文档的智能分类与语义解析。例如&#xff0c;系统可自…...

Linux线程同步机制深度解析:信号量、互斥锁、条件变量与读写锁

Linux线程同步机制深度解析&#xff1a;信号量、互斥锁、条件变量与读写锁 一、线程同步基础 在多线程编程中&#xff0c;多个线程共享进程资源&#xff08;如全局变量、文件描述符&#xff09;时&#xff0c;若对共享资源的访问不加控制&#xff0c;会导致数据不一致或竞态条…...

js逆向绕过指纹识别

​​一、兼容性说明​​ 官方支持 curl_cffi 明确支持 Windows 平台&#xff0c;并提供了预编译的安装包。其核心功能&#xff08;如浏览器指纹模拟、HTTP/2 支持&#xff09;在 Windows 上与 Linux/macOS 表现一致。 版本要求 • Python 3.8 及以上版本&#xff08;推荐 Pyth…...

笔记整理六----OSPF协议

OSPF 动态路由的分类&#xff1a; 1.基于网络范围进行划分--将网络本身划分为一个个AS&#xff08;自治系统---方便管理和维护&#xff09; 内部网关协议---负责AS内部用户之间互相访问使用的协议 IGP--RIP EIGRP ISIS OSPF 外部网关协议--负责AS之间&#xff08;整个互联网&…...

USB Type-C是不是全方位优于其他USB接口?

首先&#xff0c;USB TypeC接口内部引脚呈中心对称分布&#xff0c;正插、反插都能用&#xff0c;所以可以肓插&#xff0c;使用起来非常方便顺手。 其次&#xff0c;USB TypeC接口体积很小&#xff0c;特别是很薄&#xff0c;几乎适用于所有设备。而USB TypeA就是因为不方便应…...

信息系统监理师第二版教材模拟题第一组(含解析)

信息系统监理基础 信息系统监理的核心目标是( ) A. 降低项目成本 B. 确保项目按合同要求完成 C. 提高开发人员技术水平 D. 缩短项目周期答案:B 解析:信息系统监理的核心目标是确保信息系统工程项目按照合同要求、技术标准和规范完成,保障项目质量、进度和投资控制。 下列哪…...

NPP库中libnppist模块介绍

1. libnppist 模块简介 libnppist 是 NPP 库中专注于 图像统计分析与直方图计算 的模块&#xff0c;提供 GPU 加速的统计操作&#xff0c;适用于计算机视觉和图像处理中的特征提取与分析。 核心功能包括&#xff1a; 直方图计算&#xff08;支持单通道/多通道&#xff09; 统…...

k230摄像头初始化配置函数解析

通过 csi id 和图像传感器类型构建 Sensor 对象。 在图像处理应用中&#xff0c;用户通常需要首先创建一个 Sensor 对象。CanMV K230 软件可以自动检测内置的图像传感器&#xff0c;无需用户手动指定具体型号&#xff0c;只需设置传感器的最大输出分辨率和帧率。有关支持的图像…...

Spring的循环依赖问题

文章目录 一、什么是循环依赖&#xff1f;二、Spring 是如何解决循环依赖的&#xff1f;1.三级缓存2.解决循环依赖的流程 三、三级缓存机制可以解决所有的循环依赖问题吗&#xff1f;1. 为什么三级缓存在这里无效&#xff1f;2. 如何解决构造器循环依赖&#xff1f; 四、循环依…...

华为鸿蒙PC:开启国产操作系统自主化新纪元

——全栈自研、生态重构与未来挑战 2025年5月&#xff0c;一个值得中国科技界铭记的时间点。华为正式推出首款搭载鸿蒙操作系统&#xff08;HarmonyOS&#xff09;的PC产品。乍一听这像是又一款新电脑的发布&#xff0c;但它背后的意义远比表面更深远——这是中国首次推出从操…...

【LeetCode Hot100】动态规划篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 70. 爬楼梯 一句话题意 每次爬1or2&#xff0c;问爬到n的路…...

【Java JUnit单元测试框架-60】深入理解JUnit:Java单元测试的艺术与实践

在当今快节奏的软件开发环境中&#xff0c;保证代码质量的同时又要快速交付成为了开发者面临的主要挑战。单元测试作为软件测试金字塔的基石&#xff0c;为我们提供了一种高效的解决方案。而在Java生态系统中&#xff0c;JUnit无疑是单元测试框架的代名词。本文将全面探讨JUnit…...

Java运算符学习笔记

运算符 -运算符介绍 ​ 运算符是一种特殊的符号&#xff0c;用以表示数据的运算、赋值和比较等。 算数运算符赋值运算符关系运算符[比较运算符]逻辑运算符位运算符[需要二进制基础]三元运算符 -算数运算符 介绍 算数运算符是对数值类型的变量进行运算的&#xff0c;在Java程…...

shell编程补充内容(Linux课程实验3)

一、求前五个偶数的和 1.这里先介绍要用到的expr 1. 整数计算 # 加法&#xff08;注意运算符两侧空格&#xff09; $ expr 10 20 30# 带括号的运算&#xff08;需要转义&#xff09; $ expr \( 10 20 \) \* 2 60# 取模运算 $ expr 15 % 4 注意&#xff1a;仅支持整数&…...

iview table组件 自定义表头

在实际项目开发中&#xff0c;我们经常会用到各种各样的表格&#xff0c;比如在表格表头中填加按钮&#xff0c;下拉菜单&#xff0c;图标等等&#xff0c;在网上搜了一段时间发现比较少&#xff0c;所以写好之后就想着分享出来给有需要的人参考参考&#xff0c;例如下面这种表…...

二叉搜索树实现删除功能 Java

在开始编写删除功能之前&#xff0c;先要编写好searchParent()(寻找父节点)和min()(查找树中最小值)两个函数&#xff0c;后期会在删除功能中使用到。 searchParent()的编写 /*** * param value* return Node*/public Node searchParent(int value){if(rootnull) return null;…...

Android Framework学习三:zygote剖析

文章目录 Zygote工作内容起始点初始化步骤启动 ZygoteInitZygoteInit.main () 函数内部操作 Zygote如何启动SystemServer参与的类和文件流程步骤进程创建完成后的处理 Framework学习之系列文章 在 Android 系统中&#xff0c;Zygote 是一个非常关键的进程&#xff0c;有 “App …...

LLM-Based Agent及其框架学习的学习(三)

文章目录 摘要Abstract1. 引言2. 推理与规划2.1 推理2.2 规划2.2.1 计划指定2.2.2 计划反思 3. 迁移与泛化3.1 未知任务的泛化3.2 情景学习3.3 持续学习 4. 学习Crewai和LangGraph4.1 Crewai4.2 LangGraph 参考总结 摘要 本文系统阐述了基于大语言模型的智能体在认知架构中的核…...

修复笔记:获取 torch._dynamo 的详细日志信息

一、问题描述 在运行项目时&#xff0c;遇到与 torch._dynamo 相关的报错&#xff0c;并且希望获取更详细的日志信息以便于进一步诊断问题。 二、相关环境变量设置 通过设置环境变量&#xff0c;可以获得更详细的日志信息&#xff1a; set TORCH_LOGSdynamo set TORCHDYNAM…...

阿里云服务器全栈技术指导手册(2025版)

阿里云服务器全栈技术指导手册&#xff08;2025版&#xff09; 一、基础配置与核心架构设计 1. 精准实例选型策略 • 通用计算场景&#xff1a;选择ECS通用型&#xff08;如ecs.g7&#xff09;实例&#xff0c;搭载第三代Intel Xeon处理器&#xff0c;适合Web应用、中小型数…...

llfc项目笔记客户端TCP

一、整体架构流程图(简洁版) 复制代码 【客户端启动】 |--- 初始化TcpMgr(单例)|--- 连接信号初始化:连接成功、断开、错误、发数据| 【用户操作:登录成功】|--- 触发发起跳转:发起连接(sig_connect_tcp)| 【TcpMgr收到连接请求】|--- 连接到服务器(connectToHost)…...

基于python的task--时间片轮询

目录 前言 utf-8 chinese GB2312 utf-8 排除task.c chinese GB2312 排除task.c 运行结果 前言 建议是把能正常工作的单个功能函数放到一起&#xff08;就和放while函数里的程序一样&#xff09;&#xff0c;程序会按顺序自动配置。 不同的格式已经对应给出。 utf-8 impo…...

《前端秘籍:SCSS阴影效果全兼容指南》

在前端开发的旅程中&#xff0c;为网页元素添上阴影效果&#xff0c;就像为一幅画作点缀光影&#xff0c;能让页面瞬间生动起来&#xff0c;赋予元素层次感与立体感。可当我们满心欢喜地在SCSS中写下阴影代码&#xff0c;满心期待着在各种浏览器中都呈现出完美效果时&#xff0…...

强化学习机器人模拟器——RobotApp:一个交互式强化学习模拟器

RobotApp 是一个基于 Python 和 Tkinter 的交互式强化学习(Reinforcement Learning, RL)模拟器,集成了 GridWorld 环境和 QAgent 智能体,支持 Q-learning、SARSA 和 SARSA(λ) 算法。本博客将详细解析 robot_app.py 的功能、架构和使用方法,展示其如何通过直观的 GUI 界面…...

2025-04-26-利用奇异值重构矩阵-美团

2025-04-26-利用奇异值重构矩阵-美团 题目内容 在一家致力于图像处理的科技公司&#xff0c;你被分配到一个新项目&#xff0c;目标是开发一种图像压缩算法&#xff0c;以减少存储空间并加速传输。团队决定使用奇异值分解&#xff08; S V D SVD SVD&#xff09;对图像进行降…...

《解锁SCSS算术运算:构建灵动样式的奥秘》

SCSS作为CSS预处理器&#xff0c;算术运算功能犹如一颗璀璨明珠&#xff0c;赋予我们动态计算样式属性值的强大能力&#xff0c;让网页样式不再是一成不变的刻板呈现&#xff0c;而是能够根据各种条件和需求灵动变化。 在SCSS的世界里&#xff0c;算术运算绝非孤立的存在&…...

STM32Cube-FreeRTOS任务管理工具函数-笔记

STM32Cube-FreeRTOS任务管理工具函数-笔记 一、获取任务句柄的函数1. 创建任务并获取句柄2. 获取当前任务句柄3. 获取空闲任务句柄4. 根据任务名称获取句柄 二、单个任务操作相关函数1. 程序在运行时可以获取或改变一个任务的优先级3. 获取任务信息4. 获取任务信息5. 获取任务名…...

【第三十四周】多模态大模型调研

多模态大模型调研 摘要Abstract引言多模态技术的主要方向视觉-语言大模型&#xff08;Vision-Language Large Models, VLLMs&#xff09;语音-语言大模型&#xff08;Speech-Language Large Models, SLLMs&#xff09;音乐 - 语言大模型&#xff08;Music-Language Large Model…...

【2025最新】Baichuan-M1-instruct部署教程

首先机器至少要A100、4090、3090 这里选AutoDL的4090D&#xff0c;运行至少要20G显存。这里镜像选基础镜像11.8【更新&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;24G带不动&#xff01;显存不够】 有时候…...

Unity与Unreal Engine(UE)的深度解析及高级用法

以下是Unity与Unreal Engine(UE)的深度解析及高级用法对比,结合技术特性、行业应用与未来发展进行综合阐述: 一、核心差异与适用场景对比 1. 技术架构与编程模式 Unity 语言与脚本:主要使用C#,语法简洁且易于学习,适合快速原型开发和中小型项目。支持可视化脚本工具(如…...

网络:TCP三次握手、四次挥手

目录 深刻理解三次握手 深刻理解四次挥手 深刻理解三次握手 三次握手时&#xff0c;如果最后一个ACK包&#xff0c;服务器没有收到&#xff0c;此时&#xff1a; 客户端&#xff1a;认为已经建立链接 服务器&#xff1a;认为没有建立链接&#xff0c;还在超时等待。 而此时…...

spdlog自定义formatter

用了之后发现&#xff0c;spdlog的默认日志记录格式为&#xff1a; [2014-10-31 23:46:59.678] [my_loggername] [info] Some message 但是这个格式不是我想要的&#xff0c;怎么办&#xff0c;这个也简单&#xff0c;上面的内容也就是几个标签的组合而已&#xff0c;spdlog自定…...

Spring AI 实战:第四章、Spring AI多模态之看图说话

引言:从"码农"到"多媒体魔术师" “曾经,我们的代码核心擅长处理文本,就像餐厅里只会做炒饭的厨师。现在有了Spring AI多模态支持,我们突然拥有满汉全席的烹饪技巧!” 作为一名常年与String打交道的开发者,当第一次看到Spring AI可以同时处理图片、音…...

ES6入门---第二单元 模块五:模块化

js不支持模块化 注意&#xff1a; 需要放到服务器环境 1、如何定义模块&#xff1f; export 东西 例&#xff1a;1.js文件中 console.log(1模块加载了);//显示是否加载了 export const a 12; export const b 5; export let c 101; const a12; const b5; const c101;ex…...

Python 函数装饰器和闭包(变量作用域规则)

本章内容&#xff1a; Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后&#xff0c;我们可以进一步探讨装饰器&#xff1a; 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...

什么是constexpr?

什么是constexpr&#xff1f; 简单来说&#xff0c;constexpr就是告诉编译器&#xff1a;“我这个变量或函数的值可以在编译时算出来&#xff0c;请帮我提前算好&#xff0c;运行时直接用结果&#xff0c;不用再算了。” • **传统const**只表示变量不可修改&#xff0c;但不…...

如何在 PowerEdge 服务器上设置 NIC 分组

以下文章提供了有关 Windows、VMware 和 Linux 中的 NIC 分组的信息。 什么是网络适配器分组&#xff1f;设置 NIC 分组 Windows设置 NIC 分组 VMware设置 NIC 分组 Linux 什么是网络适配器分组&#xff08;绑定&#xff09;&#xff1f; 网络适配器分组是一个术语&#xff0…...

ES6入门---第三单元 模块四:Set和WeakSet

set数据结构: 类似数组&#xff0c;但是里面不能有重复值&#xff0c;如果有&#xff0c;只显示一个 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一项 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 删除一项 setArr.ha…...

架构进阶:75页架构规划方法课件 【附全文阅读】

本文概述了一个关于架构规划方法的目录及其目的&#xff0c;重点介绍了基于联邦企业架构&#xff08;FEAF&#xff09;的架构建模方法&#xff0c;并提及了不同层面的架构建模方法以及培训的目的。以下是对该内容的简洁总结&#xff1a; **架构规划方法目录及其目的** 本文旨在…...

前端面经-VUE3篇(三)--vue Router(二)导航守卫、路由元信息、路由懒加载、动态路由

一、导航守卫 vue Router 中的 导航守卫&#xff08;Navigation Guards&#xff09; 是一个非常重要的功能&#xff0c;用于在路由切换过程中&#xff0c;拦截、控制、检查或延迟页面跳转。 你可以理解为&#xff1a; &#x1f510; “进门前的保安”&#xff0c;控制哪些页面…...

RTX-3090 Qwen3-8B Dify RAG环境搭建

RTX-3090 Qwen3-8B Dify RAG环境搭建 一、环境配置二、操作步骤1、创建容器2、下载`Qwen3-8B`和embedding模型3、安装`transformers`4、安装`vllm`5、安装`flash-attention`6、启动兼容OpenAI API的服务1、方案一:启动`vllm`服务【不支持多任务】2、方案二:Flask和PyTorch实现的…...

Circular Plot系列(三):【视频教程】复现NCS图表之高大上的单细胞UMAP环形图

高端复杂的UMAP复现&#xff1a; 这又是一个高大上且炫酷的单细胞UMAP图&#xff0c;展示的信息很多&#xff0c;有大类细胞和亚群&#xff0c;以及marker基因和cell count信息&#xff0c;还可以增加其他的分组信息等等。没错&#xff0c;看这个图就是circlize一层层画的。我们…...

MCP智能体多Agent协作系统设计(Multi-Agent Cooperation)

目录 &#x1f680; MCP智能体多Agent协作系统设计&#xff08;Multi-Agent Cooperation&#xff09; &#x1f31f; 为什么需要多Agent协作&#xff1f; &#x1f9e0; 多Agent协作系统架构设计 &#x1f6e0;️ 1. 构建基础智能体基类&#xff08;Agent Base&#xff09;…...

栈Stack

一 栈:先进后出 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 Stack<Integer> sta…...