C++ 可调用实体 (详解 一站式)
目录
可调用实体
函数对象
函数指针
成员函数指针
空指针的使用(了解)
可调用实体
讲到调用这个词,我们首先能够想到普通函数和函数指针,在学习了类与对象的基础知识后,还增加了成员函数,那么它们都被称为可调用实体。事实上,根据其他的一些不同的场景需求,C++还提供了一些可调用实体,它们都是通过运算符重载来实现的。
普通函数执行时,有一个特点就是无记忆性。一个普通函数执行完毕,它所在的函数栈空间就会被销毁,所以普通函数执行时的状态信息,是无法保存下来的,这就让它无法应用在那些需要对每次的执行状态信息进行维护的场景。大家知道,我们学习了类与对象以后,有了对象的存在,对象执行某些操作之后,只要对象没有销毁,其状态就是可以保留下来的。
函数对象
想让对象像一个函数一样被调用
class FunctionObject{//...
};void test0(){FunctionObject fo;fo(); //让对象像一个函数一样被调用
}
上面的代码看起来很奇怪,如果我们从运算符的视角出发,就是函数调用运算符()要处理FunctionObject对象,只需要实现一个函数调用运算符重载函数即可。
函数调用运算符必须以成员函数的形式进行重载
class FunctionObject{void operator()(){cout << "void operator()()" << endl;}
};void test0(){FunctionObject fo;fo(); //ok
}
在定义 "()" 运算符的语句中,第一对小括号总是空的,因为它代表着我们定义的运算符名称,第二对小括号就是函数参数列表了,它与普通函数的参数列表完全相同。对于其他能够重载的运算符而言,操作数个数都是固定的,但函数调用运算符不同,它的参数是根据需要来确定的, 并不固定。
重载了函数调用运算符的类的对象称为函数对象,由于参数列表可以随意扩展 ,所以可以有很多重载形式(对应了普通函数的多种重载形式)
#include<iostream>
using namespace std;class FunctionObject
{
public://对函数调用运算符--()进行重载//第一个括号是和operator连在一起的作为函数名//第二个括号是参数列表,只不过此时定义时是一个无参的成员函数void operator()(){cout << "operator()函数一" << endl;}//函数调用运算符重载比较特殊//其操作数个数可以为任意个数(this指针必须有)int operator()(int x){cout << "operator()函数二" << endl;return x;}double operator()(double x, int y){cout << "operator()函数三" << endl;return x + y;}
};
void func1() {cout << "hello" << endl;
}
int func2(int x)
{return x;
}
double func3(double x, int y)
{return x + y;
}void test0()
{FunctionObject fo;//fo对象可以作为函数对象使用fo();fo.operator()();//本质cout << fo(5) << endl;cout << fo.operator()(5) << endl;cout << fo(3.5, 7) << endl;cout << fo.operator()(3.5, 7) << endl;
}
int main()
{test0();return 0;
}
class FunctionObject{
public:void operator()(){cout << "FunctionObject operator()()" << endl;++ _count;}int operator()(int x, int y){cout <<"operator()(int,int)" << endl;++ _count;return x + y;}int _count = 0;//携带状态
};void test0(){FunctionObject fo;cout << fo() << endl;cout << fo.operator()() << endl;//本质cout << fo(5,6) << endl;cout << fo.operator()(5,6) << endl;//本质cout << "fo._count:" << fo._count << endl;//记录这个函数对象被调用的次数
}
函数对象相比普通函数的优点:
可以携带状态(函数对象可以封装自己的数据成员、成员函数,具有更好的面向对象的特性)
如上,可以记录函数对象被调用的次数,而普通函数只能通过全局变量做到(全局变量不够安全)。
除此之外,函数对象作为STL的六大组件之一而存在,可以做很多定制化的行为。后面的章节中会学到。
下面为测试代码,可以自行测试
#include<iostream>
using namespace std;class FunctionObject
{
public://对函数调用运算符--()进行重载//第一个括号是和operator连在一起的作为函数名//第二个括号是参数列表,只不过此时定义时是一个无参的成员函数void operator()(){_cnt++;cout << "operator()函数一" << endl;}//函数调用运算符重载比较特殊//其操作数个数可以为任意个数(this指针必须有)int operator()(int x){_cnt++;cout << "operator()函数二" << endl;return x;}double operator()(double x, int y){_cnt++;cout << "operator()函数三" << endl;return x + y;}//const 将this指针变为双重const定义的指针,指针指向不可变,//指针指向的值也不可以改变,就是对_cnt进行了限制int getcount() const{return _cnt;}
private:int _cnt = 0;
};
int cnt = 0;
void func1() {cnt++;cout << "hello" << endl;
}
int func2(int x)
{cnt++;return x;
}
double func3(double x, int y)
{cnt++;return x + y;
}void test0()
{FunctionObject fo;//fo对象可以作为函数对象使用fo();fo.operator()();//本质cout << fo(5) << endl;cout << fo.operator()(5) << endl;cout << fo(3.5, 7) << endl;cout << fo.operator()(3.5, 7) << endl;//如果我想记录一下函数调用的次数,我可以怎么办呢?//1.对于普通函数我可以设置全局变量,但是这个全局变量我可以随时修改,不安全//2.那么对于函数对象我们就可以,在类中添加私有数据成员,在类外不可以访问和修改,但是我想//打印就要通过成员函数的形式进行获取//对于普通函数//只能通过全局变量//不够安全//func1();//func2(3);//func3(3.5, 5);不会对我进行限制可以修改,不够安全//cnt = 0;//cout << cnt << endl;//对于函数对象,想要记录调用的次数//可以通过数据成员的方式进行记录//比较安全cout << fo.getcount() << endl;//_cnt为私有成员无法直接访问,需要通过成员函数的形式进行获取//cout << fo._cnt << endl;
}
int main()
{test0();return 0;
}
函数指针
既然对象可以像一个函数一样去调用,那函数可不可以像一个对象一样去组织?
如果可以,那函数类型由什么决定呢,也就是说,如果把函数看作对象,如何从这些“对象”抽象出类来?
在C的阶段就学习过函数指针,定义函数指针时要明确使用这个指针指向一个什么类型的函数(返回类型、参数类型都要确定)
void print(int x){cout << "print:" << x << endl;
}void display(int x){cout << "display:" << x << endl;
}int main(void){//省略形式void (*p)(int) = print;p(4);p = display;p(9);//完整形式void (*p2)(int) = &print;(*p2)(4);p2 = &display;(*p2)(9);
}
定义函数指针p后,可以指向print函数,也可以再指向display函数,并通过函数指针调用函数(两种方式——完整/省略);
——那么其实可以抽象出一个函数指针类,这个类的对象就是这个特定类型的函数指针
p和p2可以抽象出一个函数指针类型void(*)(int) —— 逻辑类型,不能在代码中直接以这种形式写出
以前我们使用typedef可以定义类型别名,这段程序中函数指针p、p2的类型是void (*) (int),但是C++中是没有这个类的(我们可以这样理解,但是代码不能这么写)
可以使用typedef定义这样的一个新类型
可以理解为是给void ( * ) (int) 取类型别名为Function
typedef void(*Function)(int);
Function类的“对象”可以这样使用,这个类的“对象”都是特定类型的函数指针,只能指向一种函数(这种函数的类型在定义函数指针类时就决定了)
Function f;f = print;f(19);f = display;f(27);
成员函数指针
函数指针的用法熟悉后,顺势思考一个问题:成员函数能否也使用这种形式?如果可以,应该怎样定义一个成员函数指针
比如有这样一个类FFF,包含两个成员函数
class FFF
{
public:void print(int x){cout << "FFF::print:" << x << endl;}void display(int x){cout << "FFF::display:" << x << endl;}
};
定义一个函数指针要明确指针指向的函数的返回类型、参数类型,那么定义一个成员函数指针还需要确定的是这个成员函数是哪个类的成员函数(类的作用域)
与普通函数指针不一样的是,成员函数指针的定义和使用都需要使用完整写法,不能使用省略写法,定义时要完整写出指针声明,使用时要完整写出解引用(解出成员函数后接受参数进行调用)。
另外,成员函数需要通过对象来调用,成员函数指针也需要通过对象来调用。
void (FFF::*p)(int) = &FFF::print;
FFF ff;
(ff.*p)(4);
类比来写,也可以使用typedef来定义这种成员函数指针类,使用这个成员函数指针类的”对象“调用FFF类的成员函数print
这里有一个要求 —— 成员函数指针指向的成员函数需要是FFF类的公有函数
typedef void (FFF::*MemberFunction)(int); //定义成员函数类型MemberFunctionMemberFunction mf = &FFF::print; //定义成员函数指针 FFF fff; (fff.*mf)(15);//通过对象调用成员函数指针
此时就出现了一个新的运算符 ".*" —— 成员指针运算符的第一种形式。
FFF类对象还可以是一个堆上的对象
FFF * fp = new FFF();(fp->*mf)(65);//通过指针调用成员函数指针
又引出了新的运算符 "->*" —— 成员指针运算符的第二种形式。
成员函数指针的意义:
-
回调函数:将成员函数指针作为参数传递给其他函数,使其他函数能够在特定条件下调用该成员函数;
-
事件处理:将成员函数指针存储事件处理程序中,以便在特定事件发生时调用相应的成员函数;
-
多态性:通过将成员函数指针存储在基类指针中,可以实现多态性,在运行时能够去调用相应的成员函数。
下面为测试代码可自行测试
#include <iostream>
using namespace std;
typedef void(*function)(int);class FFF
{
public:void print(int x) {cout << "FFF::print:" << x << endl;}void display(int x) {cout << "FFF::display:" << x << endl;} void func() {cout << "func()" << endl;}int func2(int x){cout << "func2()" << endl;}static void show(int x){cout << "show():" << x << endl;}
};
//要将这个写到类的下面
//对一类特定的成员函数指针给出新的类型名称
//menfunction 类型的变量就是这种类型的成员函数指针变量
typedef void(FFF ::* menfunction)(int);
void test()
{//这里为什么将成员函数设置为静态就可以使用// 因为静态成员函数可以通过类名直接调用//和普通函数一样只是找到地址就可以调用,不需要特定对象调用function f1 = FFF::show;f1(10);//普通成员函数不能指向一个类的非静态成员函数//f1 = FFF::display;//error//需要定义一个成员函数指针才能指向一个累的非静态成员指针//注意://(1)在指针名前面也加上类作用域限定//(2)必须使用完整形式//定义成员函数指针时就已经确定了能够指针的成员函数// 返回类型 函数参数信息 类信息void (FFF::*f2)(int) = &FFF::print;//想要使用普通的成员函数,要通过对象来使用,因为他本身就是需要通过对象来使用的//所以创建一个对象FFF fff;//因为定义的时候就是使用的完整的形式,所以使用时也要使用完整的形式// .*成员指针运算符之一(fff.*f2)(26);f2 = &FFF::display;(fff.*f2)(37);//下面两种情况类型不一样//f2 = &FFF::func;//error//f2 = &FFF::func2;//error//f2 = &DDD::func3;//errorvoid (FFF:: * f3)(int);f3 = &FFF::display;(fff.*f3)(18);menfunction f4;f4 = &FFF::print;(fff.*f4)(63);// .和->都是成员访问运算符FFF* ft = new FFF();// 成员指针运算符之二//运算符名称中的指针说明f4是一个指针(ft->*f4)(74);
}
int main()
{test();return 0;
}
空指针的使用(了解)
接着上面的例子,我们来看一段比较奇怪的代码
fp = nullptr;
(fp->*mf)(34);
发现竟然是可以通过的并输出了正常的结果。难道空指针去调用成员函数指针没有问题吗?
事实上,空指针去调用成员函数也好、成员函数指针也好,只要不涉及到访问该类数据成员,都是可以的。
class Bar{
public:void test0(){ cout << "Bar::test0()" << endl; }void test1(int x){ cout << "Bar::test1(): " << x << endl; }void test2(){ cout << "Bar::test2(): " << _data << endl; }int _data = 10;
};void test0(){Bar * fp = nullptr;fp->test0();//okfp->test1(3);//okfp->test2(); //error
}
结合内存图来分析
空指针没有指向有效的对象。对于不涉及数据成员的成员函数,不需要实际的对象上下文,因此就算是空指针也可以调用成功。对于涉及数据成员的成员函数,空指针无法提供有效的对象上下文,因此导致错误。
自己写代码别这么写,看到这样的代码知道为什么不报错就行了。
总结:
C++中普通函数、函数指针、成员函数、成员函数指针、函数对象,可以将它们概括为可调用实体。
相关文章:
C++ 可调用实体 (详解 一站式)
目录 可调用实体 函数对象 函数指针 成员函数指针 空指针的使用(了解) 可调用实体 讲到调用这个词,我们首先能够想到普通函数和函数指针,在学习了类与对象的基础知识后,还增加了成员函数,那么它们都被…...
架构师与高级工程师:职业差异与进阶之路
“学而不思则罔,思而不学则殆。”——孔子 解释:该名言强调了学习和思考的结合,对应文章中工程师若想晋升为架构师,不能仅满足于对工具的学习,还要深入探究事物本质,培养深度思考能力,体现了思…...
声纹监测技术在新能源汽车的应用场景解析
新能源汽车声纹监测技术可应用于多个场景,以下是详细解析: 故障诊断 电机系统故障检测:新能源汽车的电机在运行过程中会发出特定的声音。通过声纹监测技术,采集电机运行时的声音信号并进行分析,能够及时发现电机轴承磨…...
About why docker application mode taskmanager not down in time
Tips: docker flink application mode 当任务完成或者jobmanager cancel,则taskmanager会因为flink集群机制继续保留监听等待jobmanager发送任务命令,当超过大约6 mins,taskmanager便会自动exited退出。...
2025-4-27-C++ 学习 数组(2)
数组 2025-4-27-C 学习 数组(2)P2550 [AHOI2001] 彩票摇奖题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示题解代码 P2615 [NOIP 2015 提高组] 神奇的幻方题目背景题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例…...
timerfd定时器时间轮定时器
目录 一、timerfd定时器 二、timerfd定时器代码演示 三、时间轮定时器 一、timerfd定时器 timerfd是一种通过文件描述符管理定时器的机制 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); 作用:创建定时器的文件描述符 返回值&…...
什么是数据中心代理IP?有哪些用途?
在海外代理IP的选择中,数据中心代理IP是一个热门选项。这些代理服务器为用户分配了非ISP(互联网服务提供商)提供的IP地址,而是由第三方云服务提供商所提供的,通常位于数据中心内的服务器上,由托管和云公司所…...
机器学习分类模型性能评估:应对类别不平衡的策略与指标
在机器学习的世界里,模型们就像一群努力破案的侦探,而数据就是它们的“犯罪现场”。今天,咱们的主角——一个自命不凡的分类模型,接到了一个看似简单的任务:揪出那些患有罕见疾病的患者。这听起来是不是很容易…...
论文导读 - 基于边缘计算、集成学习与传感器集群的便携式电子鼻系统
基于边缘计算、集成学习与传感器集群的便携式电子鼻系统 原论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0925400522015684 引用此论文(GB/T 7714-2015): WANG T, WU Y, ZHANG Y, et al. Portable electr…...
Molex莫仕连接器:增强高级驾驶辅助系统,打造更安全的汽车
随着对先进、高耗电量的系统的需求日益增长,电气化进程不断加速,汽车行业正处于一个十字路口。现代汽车面临着关键挑战,即满足不断增长的电力需求,特别是高级驾驶辅助系统(ADAS)等关键技术的需求。 由于现今的汽车比以往需要更多的…...
[密码学实战]SDF之密钥管理类函数(二)
[密码学实战]SDF之密钥管理类函数(二) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-af5D1B1iHx3K8vSU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...
多实例情况下,实例名较长dbca失败
dbca创建数据库,但是失败,提示ORA-01158 看来千锤百炼的dbca脚本还是菜,直觉上讲不应该mount上,看一下Action 本地已存在多个实例且名称前缀类似,下一步应该分析dbca日志和实例的alert.log 改为 一个简短的实例名就…...
模电——PN结
一、铺垫 这篇文章将会吊打一切、只会从电子、电场力的角度来阐述PN结为啥会形成、和变薄、变厚;不再考虑空穴这种东西;——提出空穴的人,真不是东西 我敢打赌,全网,我的说法不一定对,但是绝对是唯一可以…...
c++11 : 特殊类设计
目录 一 设计一个类:只能在堆上创建对象 二 设计一个类:只能在栈上创建对象 三 设计一个类:不能被拷贝 四 设计一个类:不能被继承 五 设计一个类: 只能创建一个对象(单例模式) 六 饿汉和懒汉模式的对比 一 设计一个类…...
算法笔记.kruskal算法求最小生成树
题目:(来源:AcWing) 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。 给定一张边带权的无向…...
量子算法调试:Grover算法搜索空间压缩过程可视化方案
一、Grover算法核心原理回顾 Grover算法通过以下两步迭代实现搜索空间压缩: Oracle操作(相位翻转) 标记目标状态: Uω∣x⟩={−∣x⟩x=ω∣x⟩x≠ωUω∣x⟩={−∣x⟩∣x⟩x=ωx=ω 扩散操作(振幅放大) 执行反转平均操作: D=2∣s⟩⟨s∣−ID=2∣s⟩⟨s∣−I 其…...
零基础搭建AI作曲工具:基于Magenta/TensorFlow的交互式音乐生成系统
引言:当AI遇见莫扎特 “音乐是流动的建筑”,当人工智能开始理解音符间的数学规律,音乐创作正经历着前所未有的范式变革。本文将手把手教你构建一套智能作曲系统,不仅能够生成古典钢琴小品,还能实现巴洛克与爵士风格的…...
springboot项目文件上传到服务器本机,返回访问地址
文件上传到服务器本机,然后给出访问地址: 具体如下: 1、添加必要的工具类依赖 <!-- 文件上传工具类 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>…...
mysql community 8.0.23升级到8.0.42再到8.4.5
近日生产服务器准备正式试运行,数据进入客户的专有网络,于是甲方派了人过来测漏洞,结果扫出一大堆。其间关于mysql的漏洞300多个,吓死人。给出的补丁地址,打开来看,全部是英文,可能是一些什么测…...
ubuntu安装docker,conda,tmux,btop,nvitop
在 Ubuntu 上安装 Docker Engine (使用华为云源) 1. 更新系统软件包 sudo apt update sudo apt upgrade -y2. 安装必要的依赖包 sudo apt install -y \ca-certificates \curl \gnupg \lsb-release \git \vim \wget3. 添加 Docker 的 GPG 密钥 (来自华为云镜像) # 创建用于存…...
大模型在肝硬化腹水风险预测及临床方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化腹水术前风险 3.1 术前风险因素分析 3.2 大模型预测术前…...
孙宇晨将出席迪拜Token2049 与特朗普次子共话加密未来
据官方消息,波场TRON创始人孙宇晨将出席5月1日在迪拜举办的Token2049峰会上,并与特朗普次子埃里克特朗普(Eric Trump)进行一场备受瞩目的炉边对话,出席对话的人士还包括特朗普家族支持的去中心化金融项目WLFI(World Liberty Financial)的联合创始人Zach Witkoff。这场对话不仅彰…...
深入理解同源策略与跨域资源共享(CORS)
深入理解同源策略与跨域资源共享(CORS) 前言 在当今的 Web 开发中,跨域资源请求已成为常见需求。然而,浏览器的同源策略(Same-Origin Policy)作为最基础的安全机制,限制了不同源之间的资源交互…...
Vue 生命周期钩子总结
Vue 生命周期钩子总结 Vue 组件的生命周期钩子允许在组件不同阶段执行自定义逻辑。以下是各阶段的钩子函数及其用途、触发时机和注意事项: 1. 生命周期阶段概览 Vue 组件的生命周期分为四个主要阶段: 创建(Creation)࿱…...
【解决方案】Linux解决CUDA安装过程中GCC版本不兼容
Linux解决CUDA安装过程中GCC版本不兼容 目录 问题描述 解决方法 安装后配置 问题描述 Linux环境下安装 CUDA 时,运行sudo sh cuda_10.2.89_440.33.01_linux.run命令出现 “Failed to verify gcc version.” 的报错,提示 GCC 版本不兼容,查…...
网络准入控制系统推荐:2025年构建企业网络安全的第一道防线
随着信息技术的飞速发展,企业网络环境日益复杂,阳途网络准入控制系统作为一种先进的网络安全解决方案,其核心是确保网络接入的安全性。 一、网络准入控制系统的基本原理与功能 网络准入控制以“只有合法的用户、安全的终端才可以接入网络”为…...
AI Agent
李宏毅:从零开始搞懂 AI Agent - 知乎台大李宏毅2025 AI Agent新课来了! - 知乎读懂AI Agent:基于大模型的人工智能代理 - 知乎 1.什么是AI Agent 一个基于大模型的 AI Agent 系统可以拆分为大模型、规划、记忆与工具使用四个组 件部分。AI A…...
大模型如何应对内容安全:原理、挑战与技术路径探讨
随着大语言模型(LLM)技术的广泛应用,从AI写作助手到智能客服、再到生成式内容平台(AIGC),AI 正以前所未有的速度深入人类社会的各个角落。然而,随之而来的内容安全问题也日益凸显:模…...
Flinkcdc 实现 MySQL 写入 Doris
Flinkcdc 实现 MySQL 写入 Doris Flinkcdc 实现 MySQL 写入 Doris 一、环境配置 Doris:3.0.4 JDK 17 MySQL (业务数据库):5.7 MySQL(本地数据库):5.7 Flink:flink-1.19.1 flinkc…...
vim粘贴代码格式错乱 排版错乱 缩进错乱 解决方案
从IDE复制代码, 粘贴到vim打开的文件 出现以下格式错乱解决方案 在使用 Vim 编辑器粘贴代码时,出现格式错乱的问题,通常是因为 Vim 的自动缩进功能与粘贴的代码发生了冲突。Vim 默认会尝试对输入的内容进行自动缩进,这会导致粘贴的代码被错误…...
发那科机器人(基本操作、坐标系、I/O通信)
发那科机器人(基本操作、坐标系、I/O通信) 一,机器人基本操作1,坐标系种类2,机器人手动操作一关节运动3,机器人手动操作一直角运动二,坐标系建立1,工具坐标系建立原理及验证方法2,工具坐标系建立步骤3,用户坐标系建立原理及验证方法4,用户坐标系建立步骤三,I/O通信…...
GPU 架构入门笔记
引文位置:https://www.trainy.ai/blog/gpu-utilization-misleading 相关概念是通过 ChatGPT 迅速学习总结而成。 概念: GPU H100 GPU, with 144 SMs 每个 SM(streaming multiprocessors) 的架构: GPU Utilizati…...
centos7使用yum快速安装Docker环境
一、基础环境设置 1:关闭防火墙和内核安全机制 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 02:配置网络yum源 [rootlocalhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Cento…...
解密面试高频题:加权轮询负载均衡算法 (Java 实现)
在分布式系统设计和面试中,负载均衡是一个绕不开的话题。而加权轮询(Weighted Round Robin, WRR)作为一种经典且实用的负载均衡策略,经常出现在笔试题和面试环节中。本文将带你深入理解 WRR 算法的原理,并探讨几种常见…...
Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
延时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中默认系统中的所有普通…...
高效运维,智慧监测:COMEM光纤温度测量系统在电力行业中的应用
在电力行业中,变压器的稳定运行对于整个电网的安全很重要。为了确保变压器的健康状态,实时、精确的温度监测成为了不可或缺的一环。COMEM光纤温度测量系统应运而生,为变压器的温度监测提供了创新的解决方案。 变压器温度监测的重要性 变压器在…...
TP5兼容达梦国产数据库
1.首先数据库安装,部署时需配置大小写不敏感 2.安装PHP达梦扩展,一定要是对应版本(兼容操作系统)的扩展,否则会出现各种报错。参考官方文档:https://eco.dameng.com/document/dm/zh-cn/app-dev/php_php_new…...
[leetcode]2302.统计得分小于k的子数组
1.题目 2.事例 3.数据规模 4.思路(滑动窗口) 4.1滑动窗口的定义 滑动窗口是一种在数组、字符串等序列数据结构上进行操作的算法技巧。以下是其定义及相关要素的详细介绍: 定义:滑动窗口可以理解为在一个序列上,用一…...
Linux网络编程:TCP多进程/多线程并发服务器详解
Linux网络编程:TCP多进程/多线程并发服务器详解 TCP并发服务器概述 在Linux网络编程中,TCP服务器主要有三种并发模型: 多进程模型:为每个客户端连接创建新进程多线程模型:为每个客户端连接创建新线程I/O多路复用&am…...
Nacos源码—1.Nacos服务注册发现分析二
大纲 1.客户端如何发起服务注册 发送服务心跳 2.服务端如何处理客户端的服务注册请求 3.注册服务—如何实现高并发支撑上百万服务注册 4.内存注册表—如何处理注册表的高并发读写冲突 2.服务端如何处理客户端的服务注册请求 (1)客户端自动发送服务注册请求梳理 (2)Nacos…...
设备指纹护航电商和金融反欺诈体系建设
众所周知,人的指纹具有唯一性,可以作为人的身份识别标识。对于设备而言,也有可以用于识别的特征。设备指纹是指可以用于唯一标识出某一设备的特征或者独特的设备标识,具有固定性、较难篡改性、唯一性等特质。 设备指纹是金融机构…...
FFmpeg源码学习---ffmpeg
1、ffmpeg源码主函数 ┌────────────────────┐ │ main() │ └─────────┬───────────┘ ↓ ┌────────────────────┐ │ 初始化 (日志/网络等) │ │ init_dynload() │ │ avf…...
leetcode 206. 反转链表
题目描述: 迭代法: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …...
NVIDIA新模型DAM-3B:描述一切,图像视频局部描述新突破
在数字时代,图像和视频内容爆炸式增长,如何让AI像人类一样精准描述画面中的特定区域,成为计算机视觉领域的核心挑战。传统模型要么丢失细节,要么缺乏上下文,而NVIDIA与UC Berkeley联合团队提出的DAM(Descri…...
7、langChain和RAG实战:基于LangChain和RAG的常用案例实战
PDF 文档问答ChatBot 本地上传文档 支持 pdf支持 txt支持 doc/docx问答页面 python环境 新建一个requirements.txt文件streamlit python-docx PyPDF2 faiss-cpu langchain langchain-core langchain-community langchain-openai然后安装相应的包pip install -r requirements.t…...
c++11: 类型转换
目录 一 C语言中的类型转换 二 . C强制类型转换 1. static_cast 2. reinterpret_cast 3. const_cast 4. dynamic_cast 三 explicit 关键字 一 C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配ÿ…...
Matlab自学笔记五十二:变量名称:检查变量名称是否存在或是否与关键字冲突
1.变量名称的命名规则 有效的变量名称以字母开头,后跟字母、数字或下划线,Matlab变量名称对字母大小写是区分的,A和a是不相同的变量,不能使用与Matlab关键字冲突的变量名称,例如if、end等,判断一个字符是不…...
西门子PLC结构化编程_水处理系统水泵多备多投
文章目录 前言一、功能概述二、程序编写1. 需求分析2. 编写运行时间累计功能块3. 创建自定义数据类型1. 时间排序数据类型2. 多备多投数据类型3. 多备多投切换数据类型 4. 编程1. 创建DB数据块1. 多备多投数据块2. 多备多投切换数据块 2. 创建FB功能块 三、程序调用总结 前言 …...
AutoGen 框架深度解析:构建多智能体协作的事件驱动架构
在当下多智能体(Multi-Agent)AI系统快速发展的背景下,AutoGen 作为微软研究院开源的编程框架,为构建可扩展、灵活且可调试的智能体协作应用提供了完备的工具与最佳实践。本文将从设计动机、核心架构、关键概念、安装与快速上手、典型场景、进阶特性、生态与扩展、最佳实践,…...
算法相关概念
1 算法概述 1.1 算法概念 算法是特定问题求解步骤的描述,也是独立存在的一种解决问题的思想和方法 对于算法而言,实现他的编程语言无关紧要,重要的是思想和方法!!! 公式:程序算法数据结构&a…...