C/C++语言基础--C++STL库之仿函数、函数对象、bind、function简介
本专栏目的
- 更新C/C++的基础语法,包括C++的一些新特性
前言
- STL无疑是C++史上一个重要的发明,未来我将更新STL有关的知识点,入门绝对够了(看目录就知道了👀)
- 这是第二篇,讲仿函数
- C语言后面也会继续更新知识点,如内联汇编;
- 欢迎收藏 + 关注,本人将会持续更新。
文章目录
- 仿函数
- 可调用对象(Callable object)
- 仿函数
- 为什么要有仿函数?
- 仿函数优点
- 仿函数作用
- 函数对象
- 绑定函数
- bind
- not1
- 一元函数又叫一元谓词
- not
- ref、cref
- mem_fun
- 示例
- 总结
- 包装类
- funtion
仿函数
可调用对象(Callable object)
函数调用需要使用"()",这个“()”叫做函数调用用运算符
。
C++中的可调用对象有以下几种:
-
函数(function)
-
函数指针(function pointer)
-
仿函数(Functor)
-
lambda表达式
-
bind 函数封装的函数对象
仿函数
仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类,仿函数是定义了一个含有operator()成员函数的对象,可以视为一个一般的函数,只不过这个函数是通过类重载()
所实现的。
为什么要有仿函数?
1,假如客户有一个需求摆在我们的面前,编写一个函数:
- 函数可以获得斐波拉契数列每项的值;
- 每调用一次便返回一个值;
- 函数可根据需要重复使用。
普通函数实现:
int fibonacci()
{static int a0 = 0; //第一项static int a1 = 1; //第二项int ret = a1; //保存a1 = a0 + a1;a0 = ret;return ret;
}
int main()
{for (size_t i = 0; i < 5; i++){cout << fibonacci() << " "; //1 1 2 3 5}cout << endl;for (size_t i = 0; i < 5; i++){cout << fibonacci() << " "; //8 13 21 34 55}return 0;
}
缺点 :无法根据需求使用,如:无法想要重复获取一项值。
解决: 每一次从将初始项从新赋值为0。
int a0 = 0; //第一项
int a1 = 1; //第二项
int fibonacci()
{int ret = a1;a1 = a0 + a1;a0 = ret;return ret;
}int main()
{for (size_t i = 0; i < 5; i++){cout << fibonacci() << " "; //1 1 2 3 5 8}cout << endl;a0 = 0;a1 = 1;for (size_t i = 0; i < 5; i++){cout << fibonacci() << " "; //1 1 2 3 5 8}return 0;
}
缺点: 无法直接获取一项值,如直接获取第9项值
,而且每一次获取的时候还需要将初始值手动赋值为0;
解决: 函数对象
结合本案例,说明函数对象特点:
a> 使用具体的类对象取代函数;
b> 该类的对象具备函数调用的行为;
d>多个对象相互独立的求解数列项。
总结:函数对象利用运算符重载,使得对象可以想函数一样调用,但是对于类来说,他可以封装很多方法,很多变量,这个就可以实现普通函数完不成的东西,比如说:用成员变量储存过程数据。
解决:
class Fibonacci
{
public:Fibonacci() :_a0(0), _a1(1) {}Fibonacci(int n) :_a0(0), _a1(1) {for (int i = 0; i < n; i++){int ret = _a1;_a1 = _a0 + _a1;_a0 = ret;}}int operator()(){int ret = _a1;_a1 = _a0 + _a1;_a0 = ret;return ret;}
private:int _a0;int _a1;
};int main()
{Fibonacci fib;for (size_t i = 0; i < 5; i++){cout << fib() << " "; //1 1 2 3 5 8}cout << endl;Fibonacci fib1(9);for (size_t i = 0; i < 5; i++){cout << fib1() << " "; //55 89 144 233 377}return 0;
}
我们看到已经实现了所有需求,并且随时想从哪个数开始都行。
仿函数优点
如果可以用仿函数实现,那么你应该用仿函数,而不要用CallBack。原因在于:
- 仿函数可以不带痕迹地传递上下文参数。而CallBack技术通常使用一个额外的void*参数传递。这也是多数人认为CallBack技术丑陋的原因。
- 仿函数技术可以获得更好的性能,这点直观来讲比较难以理解。
仿函数作用
仿函数通常有下面四个作用:
- 作为排序规则,在一些特殊情况下排序是不能直接使用运算符<或者>时,可以使用仿函数。
- 作为判别式使用,即返回值为bool类型。
- 同时拥有多种内部状态,比如返回一个值得同时并累加。
- 作为算法for_each的返回值使用。
函数对象
头文件
函数对象是专门设计用于使用类似于函数的语法的对象。在 C++ 中,这是通过operator()
在其类中定义成员函数来实现的,它们通常用作函数的参数,例如传递给标准算法的谓词或比较函数,这个提出来个人感觉是为了替代函数指针,函数指针写起来确实比较麻烦。
绑定函数
这些函数根据其参数创建包装类的对象
bind
-
它的作用是将一个可调用对象(比如函数、函数指针、成员函数、成员函数指针等等)以及若干个参数绑定到一个新的函数对象上,形成一个新的可调用对象。
-
还可以用来绑定函数调用的某些参数,包括可以绑定参数顺序,可以将bind函数看作一个通用的函数包装器,它接受一个可调用对象,并返回函数对象。
-
☄ 常用,这个的出现和
std::function
,其实就相当于替代了C的函数指针,使用起来更方便了。
1. 绑定普通函数
void show(int number, const std::string& str)
{cout << number << " " << str << endl;
}
-
顺序绑定参数
auto bind_show = std::bind(show, placeholders::_1, placeholders::_2); bind_show(2,"world");
-
交换参数位置
auto bind_show1 = std::bind(show, placeholders::_2, placeholders::_1); bind_show1("world",1314520);
-
绑定固定参数
auto bind_show3 = std::bind(show, 888,placeholders::_1); //在函数调用的时候传递一个参数,一个在绑定的时候加 bind_show3("wy");
2. 绑定成员函数
😜 注意: 需要指明对象
struct Plus
{int plus(int a, int b){return a * b;}
};
{Plus plus;auto func1 = std::bind(&Plus::plus, &plus, placeholders::_1, placeholders::_2); //绑定对象指针auto func2 = std::bind(&Plus::plus, plus, placeholders::_1, placeholders::_2); //绑定对象或引用cout << func1(2, 4) << endl;
}
3. 绑定函数对象
struct Sub
{int operator()(int a, int b){return a * b;}
};
{auto func2 = std::bind(Sub(), placeholders::_1, placeholders::_2);cout << func2(3, 4) << endl;
}
4. 绑定lambda表达式
{ auto func3 = std::bind([](int a, int b) {return a / b; }, placeholders::_1, placeholders::_2);cout << func3(6 ,2) << endl;
}
not1
对一元函数对象的否定,只能对仿函数进行否定,普通函数不行,这个有时候在看一些API的源码我们会看到有这个参数,其实这个就相当于bool函数,判断是否可行。
一元函数又叫一元谓词
谓词( predicate )是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator()接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。
struct Greater5 :public unary_function<int, bool> //必须继承自一元函数类
{bool operator()(int val) const //必须加上const{return val > 5;}
};int main()
{cout << boolalpha << Greater5()(10) << endl;auto _less5 = not1(Greater5());cout << boolalpha << _less5(10) << endl;return 0;
}
not
和上面不同的是,对二元函数对象的否定,还是只能对仿函数进行否定,普通函数不行。
struct Greater:public binary_function<int,int,bool> //必须继承自二元函数类
{bool operator()(int a, int b) const //必须加上const{return a > b;}
};int main()
{cout << boolalpha << Greater()(3, 1) << endl;;auto _less = not2(Greater());cout << boolalpha << _less(3,1) << endl;;return 0;
}
ref、cref
上面提到,std::bind
可以绑定函数参数,但是想要绑定引用参数,那如何做呢? ref
和cref
这两个就是为了解决这个问题的。
- ref 普通引用
- cref 常引用
struct Inc
{mutable int number = 0;void operator()()const{cout << number << endl;number++;}
};int main()
{Inc inc;auto func = bind(std::cref(inc));func();inc();return 0;
}
mem_fun
把成员函数转为函数对象,使用对象指针或对象(引用)进行绑定
class Foo
{
public:int a{ 100 };void print(){cout << a << endl;}void print2(int val){cout << a << " val:" << val << endl;}
};int main()
{Foo f;//把成员函数转为函数对象,使用对象指针或对象(引用)进行绑定auto func = mem_fn(&Foo::print);func(f); //把对象传进去func(&f); //对象指针也行func(Foo()); //临时对象也行//把成员函数转为函数对象,使用对象指针进行绑定auto func1 = mem_fun(&Foo::print2);func1(&f,666);//把成员函数转为函数对象,使用对象(引用)进行绑定auto func2 = mem_fun_ref(&Foo::print);func2(f);return 0;
}
示例
struct Foo
{int v;Foo(int val = -1):v(val) {}void print(){cout <<v << endl;}
};int main()
{//让每个对象都调用指定的成员函数std::vector<Foo> vec(5); //存对象for_each(vec.begin(), vec.end(), mem_fn(&Foo::print));cout << endl;//让每个对象都调用指定的成员函数std::vector<Foo*> vec_ptr; //存指针for (int i = 0; i < 5; i++){vec_ptr.push_back(new Foo(i*3));} for_each(vec_ptr.begin(), vec_ptr.end(), mem_fn(&Foo::print));return 0;
}
总结
函数 | 作用 |
---|---|
mem_fun | 把成员函数转为函数对象,使用对象指针进行绑定 |
mem_fun_ref | 把成员函数转为函数对象,使用对象(引用)进行绑定 |
mem_fn | 把成员函数转为函数对象,使用对象指针或对象(引用)进行绑定 |
bind | 包括但不限于mem_fn的功能,更为通用的解决方案 |
包装类
包装类是使不同的函数(普通函数、仿函数、bind绑定的一些函数…………)打包成具有统一接口一个类型,其中最常用的是function。
funtion
函数包装器
概念: C++11 中引入了 std::function
类型,它是一个多态函数封装类,可以用来存储和调用任意可调用对象,包括函数指针、函数对象、Lambda 表达式等等。
原因:因为不管是函数名、函数指针、仿函数还是lambda表达式,它们都是一个“函数”,function的作用是能够统一类型,从而提高效率。
与bind区别:
- bind更多的是将函数和他的参数相互绑定在一起,可以使函数作为参数;
- function主要是为“不同形状的函数”包装成统一类型,可以看下面的一些案例:
-
包装普通函数
int add(int a, int b) {return a + b; }{// 包装std::function<int(int, int)> fun_add(add);cout<<fun_add(2, 3); }
-
包装成员函数(通过bind绑定)
class Wy { public:int add(int a, int b){return a + b;} };{Wy wy;std::function<int(int, int)> fun_maye_add(std::bind(&Wy::add, &wy,placeholders::_1,placeholders::_2));cout << fun_maye_add(3, 5); }
-
包装lambda表达式(刷算法题常用)
{std::function<int(int, int)> fun_lambda_add([](int a, int b)->int {return a + b; });cout << fun_lambda_add(7, 8) << endl; // 包装 }
-
包装函数对象
class Maye { public:int operator()(int a, int b){return a * b;} };{ Maye obj;std::function<int(int, int)> fun_functor(obj);cout << fun_functor(2,4); }
相关文章:
C/C++语言基础--C++STL库之仿函数、函数对象、bind、function简介
本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 STL无疑是C史上一个重要的发明,未来我将更新STL有关的知识点,入门绝对够了(看目录就知道了👀)这是第二篇,讲仿函数C语言后面也会继续更新知识点,如…...
前端导出PDF的组件及方法
前端导出PDF的组件及方法 在Web应用程序中,导出PDF文件是一项常见的需求。无论是为了打印、分享还是存档,能够将网页内容转换为PDF格式都非常有用。幸运的是,前端开发者有多种方法和组件可以实现这一功能。在本文中,我们将详细介…...
大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
水文知识图谱构建-学习+代码
文章目录 水文模型知识图谱构建与应用(核心)面向水利防汛抢险的知识图谱构建与应用知识图谱在水利工程中的构建与应用代码 水文模型知识图谱构建与应用(核心) 水文模型知识图谱构建与应用 题目:水文模型知识图谱构建…...
python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django
windows首先安装rabbitmq 点击参考安装 1、环境介绍 Python 3.10.16 其他通过pip安装的版本(Django、pika、celery这几个必须要有最好版本一致) amqp 5.3.1 asgiref 3.8.1 async-timeout 5.0.1 billiard 4.2.1 celery 5.4.0 …...
clickhouse优化记录
一、注重使用分区键来加快查询 在大数据量的情况下,如果查询语句中,可以使用分区键来进行查询,可以极大缩小数据的查询范围,加快查询速度。 二、使用order by的列,适用最左前缀匹配原则 比如表的结构是 order by(id…...
RabbitMQ如何构建集群?
大家好,我是锋哥。今天分享关于【RabbitMQ如何构建集群?】面试题。希望对大家有帮助; RabbitMQ如何构建集群? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中,集群(Cluster&#x…...
Python解压tar压缩文件
import tarfile import os# 解压文件def untar(self, log_tar_file, destination_dir):# 打开tar文件tar_file_path for tar_file_path in glob.glob(os.path.join(log_tar_file, **/*.tar), recursiveTrue):print(日志压缩文件:,tar_file_path)if ! tar_file_pat…...
Mac升级macOS 15 Sequoia后,无法ssh连接本地虚拟机
现象 macOS 15后,无法ssh连接本地启动的虚拟机,提示错误: No route to host,也ping不通。包括UTM、Parallels Desktop这两个虚拟机软件。之前都是没问题的,通过一些简单排查,目前没发现什么问题。 在虚拟…...
Unity录屏插件-使用Recorder录制视频
目录 1.Recorder的下载 2.Recorder面板 2.1常规录制属性 2.2录制器配置 2.2.1添加录制器 2.2.2配置Input属性 2.2.3配置 Output Format 属性 2.2.4配置 Output File 属性 3.Recorder的使用 3.1录制Game View视频 3.1.1Recorder配置与场景搭建 3.1.2开始录制 3.1.3…...
[ESP]从零开始的Arduino IDE安装与ESP环境配置教程
一、前言 最近也是在比赛方面比较忙,没有更多的时间和精力去更新长文章了。这几周都更倾向于环境搭建的教程,这类教程写起来确实方便,也不怎么费时间,一个下午基本可以搞定,哈哈,我保证不是在为自己想摆烂找…...
重拾设计模式--状态模式
文章目录 状态模式(State Pattern)概述状态模式UML图作用:状态模式的结构环境(Context)类:抽象状态(State)类:具体状态(Concrete State)类&#x…...
2024年全球办公键盘行业总体规模、主要企业国内外市场占有率及排名
根据QYResearch研究团队调研统计,2023年全球办公键盘市场销售额达到了 亿元,预计2030年将达到 亿元,年复合增长率(CAGR)为 %(2024-2030)。中国市场在过去几年变化较快,2023年市场规模…...
ThreadLocal用法详解
ThreadLocal 是 Java 中的一个类,它提供了线程局部变量的功能。线程局部变量是线程隔离的,每个使用该变量的线程都有其自己的变量副本,因此每个线程可以操作自己的线程局部变量,而不会和其他线程冲突。 以下是 ThreadLocal 的一些…...
linux中docker命令大全
基本命令 docker pull 拉取镜像 docker pull docker push 推送镜像到DockerRegistry docker push docker images 查看本地镜像 docker images docker rmi 删除本地镜像 docker rmi docker run 创建并运行容器(不能重复创建) docker run d…...
linux-----常用指令
文件和目录操作指令 ls(list)指令 功能:用于列出目录的内容,包括文件和子目录。示例: ls:列出当前目录下的所有非隐藏文件和目录。例如,在一个包含文件file1.txt、file2.txt和目录dir1的目录中&…...
1.gitlab 服务器搭建流程
前提条件: 一、服务器硬件水平 搭建gitlab服务器最低配置要求2核4G,低于这个配置的服务器运行效果很差。 gitlab官网:https://about.gitlab.com/ 下载地址:gitlab/gitlab-ce - Packages packages.gitlab.com 本机ubuntu 二、安装依赖 su…...
C 语言基础运算:输入两个整数并计算和、差、积
一、C 语言编程世界初窥 在当今数字化浪潮汹涌澎湃的时代,编程已成为一项极具影响力的技能,它犹如一把神奇的钥匙,能够开启无数创新与可能的大门。而在众多编程语言中,C 语言无疑是一颗最为璀璨耀眼的恒星,长久以来在编程的浩瀚星空中熠熠生辉,散发着独特而迷人的魅力。…...
PC寄存器(Program Counter Register) jvm
在JVM(Java虚拟机)中,PC寄存器(Program Counter Register)扮演着至关重要的角色,它是JVM执行引擎的核心组成部分之一。以下是PC寄存器在JVM中的具体角色和职责: 指令执行指针: PC寄存…...
CPU概述随堂测试
1. [单选题] 下列部件不属于控制器的是( )。 A. 指令寄存器 B. 程序计数器 C. 程序状态字寄存器 D. 时序电路 正确答案:C 控制器的主要组成部分包括指令寄存器(IR)、程序计数器(PC),以及用于控制…...
centos7下docker 容器实现redis主从同步
1.下载redis 镜像 docker pull bitnami/redis2. 文件夹授权 此文件夹是 你自己映射到宿主机上的挂载目录 chmod 777 /app/rd13.创建docker网络 docker network create mynet4.运行docker 镜像 安装redis的master -e 是设置环境变量值 docker run -d -p 6379:6379 \ -v /a…...
【数据安全】如何保证其安全
数据安全风险 数字经济时代,数据已成为重要的生产要素。智慧城市、智慧政务的建设,正以数据为核心,推动城市管理的智能化和公共服务的优化。然而,公共数据开放共享与隐私保护之间的矛盾日益凸显,如何在确保数据安全的…...
GTID详解
概念和组成 1,全局事务表示:global transaction identifiers 2, GTID和事务一一对应,并且全局唯一 3,一个GTID在一个服务器上只执行一次 4,mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如…...
【bodgeito】攻防实战记录
也许有一天我们再相逢,睁开眼睛看清楚,我才是英雄。 进入网站整体浏览网页 点击页面评分进入关卡 一般搭建之后这里都是红色的,黄色是代表接近,绿色代表过关 首先来到搜索处本着见框就插的原则 构造payload输入 <script>…...
【基础篇】1. JasperSoft Studio编辑器与报表属性介绍
编辑器介绍 Jaspersoft Studio有一个多选项卡编辑器,其中包括三个标签:设计,源代码和预览。 Design:报表设计页面,可以图形化拖拉组件设计报表,打开报表文件的主页面Source:源代码页码ÿ…...
SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
要使用阿里云视频点播(VOD)实现一个教育网站,其中用户需要成为会员后才能查看视频,这个过程包括上传视频、设置权限控制、构建前端播放页面以及确保只有付费会员可以访问视频内容。 1. 视频上传与管理 创建阿里云账号ÿ…...
在VBA中结合正则表达式和查找功能给文档添加交叉连接
在VBA中搜索文本有两种方式可用,一种是利用Range.Find对象(更常见的形式可能是Selection.Find,Selection是Range的子类,Selection.Find其实就是特殊的Range.Find),另一种方法是利用正则表达式,但…...
spring\strust\springboot\isp前后端那些事儿
后端 一. 插入\更新一条数据(老) Map<String, Object> parameterMap MybatisUtil.initParameterSave("Send_ProjectFrozenLog", sendProjectFrozenLog); commonMapper.insert(parameterMap);parameterMap MybatisUtil.initParameter…...
Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
文章目录 1、 缓存预热2、 缓存雪崩3、 缓存击穿4、 缓存穿透总结 1、 缓存预热 什么是预热: mysql加入新增100条记录,一般默认以mysql为准作为底单数据,如何同步给redis(布隆过滤器)这100条新数据。 为什么需要预热…...
【Java计算机毕业设计】基于Springboot小药店销售管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
AIGC与现代教育技术
目录 引言 一、AIGC在教育技术中的基本概念 1.1 什么是AIGC? 1.2 传统教育技术和AIGC的对比 二、实现过程:AIGC在现代教育中的实现 2.1 自动生成课件内容 2.1.1 代码示例:使用GPT生成教学文案 2.1.2 完善自动生成资料 2.1.3 多模态内…...
【活动邀请·深圳】深圳COC社区 深圳 AWS UG 2024 re:Invent re:Cap
re:Invent 是全球云计算领域的顶级盛会,每年都会吸引来自世界各地的技术领袖、创新者和实践者汇聚一堂,分享最新的技术成果和创新实践,深圳 UG 作为亚马逊云科技技术社区的重要组成部分,将借助 re:Invent 的东风,举办此…...
Java中的LIst
在Java中,List接口是集合框架(Collections Framework)的一部分,用于表示有序的集合(也称为序列)。List允许存储重复的元素,并且可以通过索引访问元素。以下是对Java中List的详细介绍:…...
源码分析之Openlayers中MousePosition鼠标位置控件
概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件,该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效,可以实时获取鼠标位置,但是一般控件元素都会自定义。 源码分析 MousePosition…...
List深拷贝后,数据还是被串改
List深拷贝后数据还是被串改 List newList new ArrayList<>(oldList)newList.pushAll(oldList)你甚至想到了java8streamAPI以上还不行 List newList new ArrayList<>(oldList) 这是采用构造参数做到的深拷贝,是没问题的 newList.pushAll(oldList) …...
一级路由器与二级路由器网络互通配置,实现父网络访问子网络
一级路由器与二级路由器网络互通配置,实现父网络访问子网络 从图看a路由器是b的父路由。默认配置情况下b路由下的PC设备可以访问a路由器下的PC设备,但是a路由下的设备无法访问b路由下设备。 为了实现互通,需要配置静态路由表。 我的a路由器是…...
linux作 samba 服务端,linux windows文件互传,免账号密码
一 ubuntu 安装 sudo apt install samba二 修改samba 配置文件 1 路径 ls -l /etc/samba/smb.conf2 修改文件 a:配置成 匿名用户,无需输入账号 b:注意配置可读写且文件可创建可删除 [global] workgroup SAMBA security user passdb back…...
使用C#调用SAP的WebService接口
URL 是一个 WSDL 地址,这意味着你可以使用 SOAP Web Service 来调用ZRFC_WEB_MES_MM_015 接口。我们将使用 C# 中的 System.Web.Services.Protocols.SoapHttpClientProtocol 或 System.ServiceModel 命名空间来实现这一点。这里我们使用 System.ServiceModel 命名空…...
线程知识总结(二)
本篇文章以线程同步的相关内容为主。线程的同步机制主要用来解决线程安全问题,主要方式有同步代码块、同步方法等。首先来了解何为线程安全问题。 1、线程安全问题 卖票示例,4 个窗口卖 100 张票: class Ticket implements Runnable {priv…...
HarmonyOS(72)事件拦截处理详解
事件拦截 1、参考资料2、HitTestMode3、onTouchIntercept、onTouch、onClick事件执行顺序3.1、系统默认事件传递顺序3.2、子组件拦截事件1、参考资料 HarmonyOS(71) 自定义事件分发之TouchTestStrategy使用说明HarmonyOS(70) ArkUI 事件分发拦截,事件冲突解决方案HitTestModea…...
Leetcode-208. 实现Trie(前缀树)
前缀树是一个由“路径”和“节点”组成多叉树结构。由根节点出发,按照存储字符串的每个字符,创建对应字符路径,以此实现快速查找单词或是否为前缀的功能。 此题要求简单,只需实现下面几种功能: Trie() 初始化前缀树对…...
网络安全系列 之 SQL注入学习总结
1. sql注入概述 程序里面如果使用了未经校验的外部输入来构造SQL语句,就很可能会引入SQL注入漏洞。 注入攻击 对于字符串输入,如果这个字符串将被解释为某种指令,那么需要特别注意防止注入攻击。sql注入、os命令注入、xml注入是典型的攻击类…...
JVM中的方法绑定机制
JVM中的方法绑定机制主要分为静态绑定(Static Binding)和动态绑定(Dynamic Binding)两种。以下是关于这两种绑定机制的详细解释: 一、静态绑定(Static Binding) 定义:静态绑定是指在…...
tomato靶场攻略
前提:kali和tomato的连接方式都为net模式 tomato的默认网络连接方式为桥接模式,导入前注意修改,将tomato.ova的镜像导入虚拟机中 出现此页面则表示导入成功,打开kali虚拟机终端,切换为root权限 arp-scan -l 浏览器访…...
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备 一、前提条件 确保路由器硬件支持: OpenWrt 路由器需要足够的存储空间和 CPU 性能来运行 Tailscale。确保设备架构支持 Tailscale 二进制文件,例…...
wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势
开发CuteMySQL/CuteSqlite开源客户端的时候,需要使用Scintilla编辑器,来高亮显示SQL语句,作为C/C领域最成熟稳定又小巧的开源编辑器,Scintilla提供了强大的功能,wxWidgets对Scintilla进行包装后的是控件类:…...
Spring Boot中Bean的 构造器注入、字段注入和方法注入
在Spring中,依赖注入(DI)是实现控制反转(IoC)的一种方式,Spring提供了多种注入方式来将依赖关系注入到Bean中,常见的方式有构造器注入、字段注入和方法注入。下面将详细介绍这三种注入方式。 1…...
深入浅出支持向量机(SVM)
1. 引言 支持向量机(SVM, Support Vector Machine)是一种常见的监督学习算法,广泛应用于分类、回归和异常检测等任务。自1990年代初期由Vapnik等人提出以来,SVM已成为机器学习领域的核心方法之一,尤其在模式识别、文本…...
梯度下降的数学原理:用泰勒公式剖析梯度下降
梯度下降(Gradient Descent)是机器学习中非常核心的优化算法,通过不断调整模型参数,让损失函数(Loss Function)逐渐变小,从而提高模型的性能。损失函数是一个用来衡量预测值与真实值差距的函数&…...
城市应急指挥系统
城市应急指挥系统的重要性 随着现代化城市的高速发展,我们面临着多种应急突发情景,如自然灾害、事故灾难、公共卫生事件以及社会安全事件等。这些事件对城市的安全稳定构成严重威胁,因此,建立一套高效、全面的城市应急指挥系统显…...