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

[c++11(二)]Lambda表达式和Function包装器及bind函数

1.前言

Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题,而function着重解决的是函数指针的问题,它能够将其简单化。

本章重点:

本章将着重讲解lambda表达式的规则和使用场景,以及function的使用场景及bind函数的相关使用方法。

2.为什么要有Lambda表达式

在C++98中,对自定义类型进行排序时,需要自己写仿函数,并传递给sort库函数
但是如果每次要按照自定义类型的不同成员变量进行排序的话,就要写很多个仿
函数,十分的不方便,于是C++11给出了一个新玩法:

struct Goods
{
string _name;  // 名字
double _price; // 价格
int _evaluate; // 评价
Goods(const char* str, double price, int evaluate):_name(str), _price(price), _evaluate(evaluate)
{}
};
vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._price < g2._price; });//按照价格升序
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._price > g2._price; });//按照价格降序
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._evaluate < g2._evaluate; });//按照评价升序
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._evaluate > g2._evaluate; });//按照评价降序

 后面那一坨就完美的代替了仿函数。他其实就是传说中的lambda表达式

上述代码具体分析如下:

3.Lambda表达式的语法

lambda 表达式书写格式: [capture-list] (parameters) mutable -> return-type { statement
}
表达式部分说明:
[capture-list] : 捕捉列表 ,该列表总是出现在 lambda 函数的开始位置, 编译器根据[]来
判断接下来的代码 是否为lambda函数 捕捉列表能够捕捉上下文中的变量供 lambda
函数使用
(parameters) :参数列表。与 普通函数的参数列表一致 ,如果不需要参数传递,则可以
连同 () 一起省略
mutable :默认情况下, lambda 函数总是一个 const 函数, mutable 可以取消其常量
性。 使用该修饰符时,参数列表不可省略(即使参数为空)。
->returntype :返回值类型 。用 追踪返回类型形式声明函数的返回值类型 ,没有返回
值时此部分可省略。 返回值类型明确情况下,也可省略,由编译器对返回类型进行推
{statement} :函数体 。在该函数体内,除了可以使用其参数外,还可以使用所有捕获
到的变量。
注意:
lambda 函数定义中, 参数列表和返回值类型都是可选部分 ,而捕捉列表和函数体可以为
。因此 C++11 最简单的 lambda 函数为: []{} ; lambda 函数不能做任何事情。
例:
int main()
{// 最简单的lambda表达式, 该lambda表达式没有任何意义[]{}; // 省略参数列表和返回值类型,返回值类型由编译器推导为intint a = 3, b = 4;[=]{return a + 3; }; // 省略了返回值类型,无返回值类型auto fun1 = [&](int c){b = a + c; }; fun1(10)cout<<a<<" "<<b<<endl;// 各部分都很完善的lambda函数auto fun2 = [=, &b](int c)->int{return b += a+ c; }; cout<<fun2(10)<<endl;// 复制捕捉xint x = 10;auto add_x = [x](int a) mutable { x *= 2; return a + x; }; cout << add_x(10) << endl; return 0;
}
通过上述例子可以看出, lambda 表达式实际上可以理解为无名函数,该函数无法直接调
用,如果想要直接调用,可借助 auto 将其赋值给一个变量。

4.Lambda表达式的捕捉列表

lambda表达式的捕捉列表[ ]可以捕捉父作用域的变量供自己使用。

规则如下:

#include <iostream>
#include <vector>
#include <algorithm>int main() {int x = 10;int y = 20;std::vector<int> v = {1, 2, 3, 4, 5};// 混合捕获std::vector<int> filtered;std::copy_if(v.begin(), v.end() [x, &y](int z) { return z > x && z < y; });// 输出过滤后的结果for (int n : filtered) {std::cout << n << " ";}std::cout << std::endl;return 0;
}

 在这个例子中,[x, &y] 捕获 x 的值和 y 的引用。

注意:

 lambda表达式之间不能相互赋值,即使看起来类型是相同的。

lambda表达式的使用方法和仿函数非常相似,实际在底层编译器对于lambda表达式的处理方式完全就是按照函数对象的方式处理的即:如果定义了一个lambda表达式,
编译器会自动生成一个类,在该类中重载了operator()

mutable关键字详解:

由于lambda表达式是具有常属性的,所以在通常的情况下是无法被修改的,因此在C++14中引入了mutable关键字,可以用于Lambda表达式中,以允许Lambda表达式修改捕获的变量。

例:

#include <iostream>int main() {int x = 10;auto lambda = [=]() mutable { ++x; }; // 值捕获,允许修改lambda();std::cout << x << std::endl; // 输出: 10return 0;
}

 分析:为什么这里用了mutable之后,输出还是10呢?

简单理解就是:类比函数传参,你在这里传的只是x的副本,并不是真正的x,所以外部的x并没有被修改。mutable 关键字的作用是允许 Lambda 表达式修改通过值捕获的变量。然而,值捕获的本质是复制外部变量的值到 Lambda 表达式的内部环境,

5.function包装器

function 包装器 也叫作适配器。 C++中的function本质是一个类模板,也是一个包装器。
那么我们来看看,我们为什么需要 function 呢?
ret = func(x);
// 上面func可能是什么呢?那么func可能是函数名?函数指针?函数对象(仿函数对象)?
//也有可能是lamber表达式对象?所以这些都是可调用的类型!如此丰富的类型
//可能会导致模板的效率低下!
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;
}

这样的话一份useF就实例化出了三份代码,这样就比较low了。

那么如果用function的话,那么就可以提高效率了。

Function函数的使用方法:

第一个int表示返回值,()里面的int表示参数的类型。

回到上述要解决的问题,解决方式如下:

#include <functional>
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()
{// 函数名std::function<double(double)> func1 = f;cout << useF(func1, 11.11) << endl;// 函数对象std::function<double(double)> func2 = Functor();cout << useF(func2, 11.11) << endl;// lamber表达式std::function<double(double)> func3 = [](double d)->double{ return d /
4; };cout << useF(func3, 11.11) << endl;return 0;
}

6.function包装器的使用场景

例如:1.可以存储在容器中,使得可以动态地管理和调用函数。

#include <iostream>
#include <vector>
#include <functional>int main() {std::vector<std::function<void()>> functions;functions.push_back([]() { std::cout << "Function 1" << std::endl; });functions.push_back([]() { std::cout << "Function 2" << std::endl; });for (auto& func : functions) {func();}return 0;
}

 在这个例子中,functions 容器存储了多个 std::function<void()> 类型的函数,并在运行时依次调用这些函数。

在操作系统中,不同的线程要执行不同的函数的话,那么就可以用这种方式 来进行封装并且调用函数。

2.函数适配器

std::function 可以用于创建函数适配器,使得可以将不同类型的函数适配为统一的接口。

#include <iostream>
#include <functional>void functionA(int x) {std::cout << "Function A called with " << x << std::endl;
}void functionB(double x) {std::cout << "Function B called with " << x << std::endl;
}int main() {std::function<void(int)> adapterA = functionA;std::function<void(double)> adapterB = functionB;adapterA(10);adapterB(3.14);return 0;
}

 在这个例子中,adapterAadapterB 分别适配了不同类型的功能函数,使得它们可以统一调用。

7.bind函数

std::bind 函数定义在头文件中, 是一个函数模板,它就像一个函数包装器 ( 适配器 ) 接受一个可
调用对象( callable object ),生成一个新的可调用对象来 适应 原对象的参数列表 。一般而
言,我们用它可以把一个原本接收 N 个参数的函数 fn ,通过绑定一些参数,返回一个接收 M 个( M
可以大于 N ,但这么做没什么意义)参数的新函数。同时,使用 std::bind 函数还可以实现参数顺
序调整等操作。
// 原型如下:
template <class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
// with return type (2) 
template <class Ret, class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对
象来适应原对象的参数列表。
调用bind的一般形式:auto newCallable = bind(callable,arg_list);
其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的
callable的参数。当我们调用newCallable时,newCallable会调用callable,并传给它arg_list
的参数
在正式使用bind函数之前,先介绍一下  std::placeholders 占位符
std::placeholders 提供占位符 _1, _2, _3 等,用于表示函数调用时的参数位置。
例如:
#include <iostream>
#include <functional>void print(int a, int b) {std::cout << "a: " << a << ", b: " << b << std::endl;
}int main() {auto bound_func = std::bind(print, std::placeholders::_2, std::placeholders::_1);bound_func(20, 10); // 输出: a: 10, b: 20return 0;
}

在这个例子中,std::bindprint 函数的参数位置交换了,使得 _2 即func里面的第二个参数作为print的第一个参数,_1 即func里面的第一个参数作为第二个参数传递给 print 函数。

简单总结一下:std::bind 是 C++ 标准库中的一个函数模板,用于绑定函数和对象,以便创建新的可调用对象std::bind 可以用于创建适配器,将函数、成员函数、甚至是函数对象绑定到特定的参数,从而生成新的可调用对象。

8.bind函数的使用场景

1. 绑定带有默认参数的成员函数

#include <iostream>
#include <functional>class MyClass {
public:void print(int a, int b = 0) {std::cout << "a: " << a << ", b: " << b << std::endl;}void bindAndCall() {// 使用 std::bind 绑定成员函数和 this 指针auto bound_func = std::bind(&MyClass::print, this, std::placeholders::_1, 20);// 调用绑定后的函数bound_func(10); // 输出: a: 10, b: 20}
};int main() {MyClass obj;obj.bindAndCall();return 0;
}

2.绑定函数对象

#include <iostream>
#include <functional>class PrintFunc {
public:void operator()(int a, int b) {std::cout << "a: " << a << ", b: " << b << std::endl;}
};int main() {PrintFunc pf;auto bound_func = std::bind(pf, std::placeholders::_1, 20);bound_func(10); // 输出: a: 10, b: 20return 0;
}

9.总结

lambda表达式和function包装器以及bind函数到这就讲解完毕了。

相关文章:

[c++11(二)]Lambda表达式和Function包装器及bind函数

1.前言 Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题&#xff0c;而function着重解决的是函数指针的问题&#xff0c;它能够将其简单化。 本章重点&#xff1a; 本章将着重讲解lambda表达式的规则和使用场景&#xff0c;以及function的使用场景及bind函数的相关使…...

22智能 狄克斯特拉算法复习

狄克斯特拉算法 图 根据边有无方向分为&#xff1a; 有向图、无向图 根据边有无权重变量分为&#xff1a; 有权图、无权图 根据顶点是否连通分为&#xff1a; 连通图和非连通图入度&#xff1a;表示有多少条边指向该顶点出度&#xff1a;表示有多少条边从该顶点指出算法步骤&a…...

Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)

electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...

C语言编程1.27汉诺塔

题目描述 给定一个由n个圆盘组成的塔&#xff0c;这些圆盘按照大小递减的方式套在第一根桩柱上。现要将整个塔移动到另一根桩柱上&#xff0c;每次只能移动一个圆盘&#xff0c;且较大的圆盘在移动过程中不能放置在较小的圆盘上面。 输入格式 输入由四行&#xff1a; 第一行…...

UG NX二次开发(C#)-机电概念设计-UIStyler中selection块选择信号等对象的过滤器设置

文章目录 1、前言2、创建机电概念设计的模型3、创建UIStyler4、在VS2022中创建NXOPEN CSHAP的工程5、设置信号与信号适配体的过滤器6、测试选择的对象1、前言 在UG NX二次开发过程中,经常会用到UIStyler中的Selection块,即是选择对象,选择对象由于其可以选择多种类型的对象…...

【C++】C++中的lambda函数详解

C中的lambda函数是一种匿名函数&#xff0c;它允许你在代码中直接定义一个函数对象&#xff0c;而不需要提前声明一个函数名。Lambda函数通常用于编写简短的函数&#xff0c;这些函数可能只会被调用一次或者在某些特定的上下文中使用。 Lambda函数的基本语法如下&#xff1a; …...

JS CSS HTML 的代码如何快速封装

我们为什么要封装代码&#xff0c;是因为封装后的代码&#xff0c;会显得非常美观&#xff0c;减少代码的复用&#xff0c;方便我们更好的去维护代码&#xff0c;不用一个一个页面的去找去改&#xff0c;直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装…...

矩阵运算的复杂度分析(Complexity Analysis of Matrix Operations):中英双语

矩阵运算的复杂度分析 矩阵运算在科学计算、机器学习、图像处理等领域中起着至关重要的作用。了解各种常见矩阵运算的复杂度&#xff0c;对于优化算法、提高计算效率具有重要意义。在这篇博客中&#xff0c;我们将详细探讨矩阵加法、标量乘法、矩阵转置、矩阵-向量乘法等基本矩…...

第二十四天 循环神经网络(RNN)LSTM与GRU

LSTM&#xff08;长短期记忆网络&#xff09;和GRU&#xff08;门控循环单元&#xff09;是两种流行的循环神经网络变体&#xff0c;它们被设计来解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。这两种网络都通过引入门控机制来控制信息的流动&#xff0c;从而能…...

RTC实时时钟

BKP&#xff08;备份寄存器&#xff09; 1. 什么是BKP&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电 源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff…...

移动网络(2,3,4,5G)设备TCP通讯调试方法

背景&#xff1a; 当设备是移动网络设备连接云平台的时候&#xff0c;如果服务器没有收到网络数据&#xff0c;移动物联设备发送不知道有没有有丢失数据的时候&#xff0c;需要一个抓取设备出来的数据和服务器下发的数据的方法。 1.服务器系统是很成熟的&#xff0c;一般是linu…...

项目二十三:电阻测量(需要简单的外围检测电路,将电阻转换为电压)测量100,1k,4.7k,10k,20k的电阻阻值,由数码管显示。要求测试误差 <10%

资料查找&#xff1a; 01 方案选择 使用单片机测量电阻有多种方法&#xff0c;以下是一些常见的方法及其原理&#xff1a; 串联分压法&#xff08;ADC&#xff09; 原理&#xff1a;根据串联电路的分压原理&#xff0c;通过测量已知电阻和待测电阻上的电压&#xff0c;计算出…...

如何使用checkBox组件实现复选框

文章目录 概念介绍使用方法示例代码我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍Checkbox Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Checkbox也是叫复选框,没有选中时是一个正方形边框,边框内容是空白的,选中时会…...

用bootstrap搭建侧边栏

要注意&#xff1a; 标签的id"v-pills-dataset1-tab"要和跳转内容的aria-labelledby"v-pills-dataset1-tab"一致 标签的aria-controls"v-pills-dataset1"要和跳转内容的id"v-pills-dataset1"一致 <!-- 左边的列&#xff08;侧边栏…...

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定&#xff1a;为了获取相机与机器人坐标系之间得位姿转换关系&#xff0c;需要对相机和机器人坐标系进行标定&#xff0c;该标定过程成为手眼标定&#xff0c;用于存储这一组转换关系的文件称为手眼标定文件。 ETH&#xff1a;即Eye To …...

巧记斜边函数hypot

hypot是一个数学函数&#xff0c;源于英文"hypotenuse&#xff08;斜边&#xff09;"&#xff0c;hypot(a, b)返回直角边边长为a、b的直角三角形&#xff08;right-angled triangle&#xff09;的斜边长度。该函数定义在<math.h>头文件中&#xff0c;其功能相当…...

STM32单片机芯片与内部33 ADC 单通道连续DMA

目录 一、ADC DMA配置——标准库 1、ADC配置 2、DMA配置 二、ADC DMA配置——HAL库 1、ADC配置 2、DMA配置 三、用户侧 1、DMA开关 &#xff08;1&#xff09;、标准库 &#xff08;2&#xff09;、HAL库 2、DMA乒乓 &#xff08;1&#xff09;、标准库 &#xff…...

【程序人生】掌握一门编程语言

掌握一门编程语言不仅仅是能够编写正确的语法&#xff0c;它还涉及到对语言特性、工具链、最佳实践以及解决问题的能力有深入的理解。以下是衡量你是否掌握了某门编程语言的关键指标&#xff1a; 语法与基本概念 语法熟悉度&#xff1a;能够在不查阅文档的情况下写出正确的代码…...

数据库发生了死锁怎么办

当项目中存在公共的数据表&#xff0c;比如日志表&#xff0c;同时存在对这张表的读写操作&#xff0c;或者是对数据量较大的表加索引同时伴随其他并发操作&#xff0c;那么这张表就有较高概率发生死锁。 现象&#xff1a;对于这张表的任何操作都会被阻塞&#xff0c;项目出现…...

传递函数的幅值在0到1之间

为什么所有传递函数的幅值应该在 0 到 1 之间 在声学、振动学和信号处理等领域&#xff0c;传递函数的幅值表示系统对输入信号的响应幅度。在许多声学实验中&#xff0c;传递函数的幅值反映了声波的传输或反射特性。理论上&#xff0c;所有传递函数的幅值应当在 0 到 1 之间&a…...

[Unity Shader]【图形渲染】 数学基础4 - 矩阵定义和矩阵运算详解

矩阵是计算机图形学中的重要数学工具,尤其在Shader编程中,它被广泛用于坐标变换、投影变换和模型动画等场景。本文将详细介绍矩阵的定义、基本运算以及如何在Shader中应用矩阵,为初学者打下坚实的数学基础。 一、什么是矩阵? 矩阵是一个由数字排列成的长方形数组,通常记作…...

蓝桥杯练习生第四天

小蓝每天都锻炼身体。 正常情况下&#xff0c;小蓝每天跑 11 千米。如果某天是周一或者月初&#xff08;11 日&#xff09;&#xff0c;为了激励自己&#xff0c;小蓝要跑 22 千米。如果同时是周一或月初&#xff0c;小蓝也是跑 22 千米。 小蓝跑步已经坚持了很长时间&#x…...

Jmeter压测实战:Jmeter二次开发之自定义函数

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具&#xff0c;具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换…...

梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语

雅各比矩阵与梯度&#xff1a;区别与联系 在数学与机器学习中&#xff0c;梯度&#xff08;Gradient&#xff09; 和 雅各比矩阵&#xff08;Jacobian Matrix&#xff09; 是两个核心概念。虽然它们都描述了函数的变化率&#xff0c;但应用场景和具体形式有所不同。本文将通过…...

[python SQLAlchemy数据库操作入门]-02.交易数据实体类建立

哈喽,大家好,我是木头左! 为了顺利地使用SQLAlchemy进行股票交易数据的处理,首先需要搭建一个合适的开发环境。这包括安装必要的软件包以及配置相关的依赖项。 安装Python及虚拟环境 下载并安装Python(推荐使用最新版)。创建一个新的虚拟环境以避免依赖冲突。python -m …...

python打包exe文件

由于用户需要&#xff0c;将采集数据解析成txt文件&#xff0c;为了方便使用&#xff0c;将python解析方法打包成exe文件供用户使用 安装环境 ./pip.exe install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simplepython导入需要的包 import tkinter as tk from tkin…...

C# opencvsharp 流程化-脚本化-(2)ROI

ROI ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域&#xff0c;但是图像是矩阵是矩形的&#xff0c;感兴趣的是乱八七糟的&#xff0c;所以还有一个Mask需要了解一下的。 public class RoiStep : IImageProcessingStep{public ImageProcessingStepType…...

【Python】基于Python的CI/CD工具链:实现自动化构建与发布

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,持续集成(CI)和持续交付(CD)已经成为提高开发效率和软件质量的重要实践。CI/CD流程帮助开发团队自动化构建、测试、…...

Flutter组件————Scaffold

Scaffold Scaffold 是一个基础的可视化界面结构组件&#xff0c;它实现了基本的Material Design布局结构。使用 Scaffold 可以快速地搭建起包含应用栏&#xff08;AppBar&#xff09;、内容区域&#xff08;body&#xff09;、抽屉菜单&#xff08;Drawer&#xff09;、底部导…...

2024年《网络安全事件应急指南》

在这个信息技术日新月异的时代&#xff0c;网络攻击手段的复杂性与日俱增&#xff0c;安全威胁层出不穷&#xff0c;给企事业单位的安全防护能力带 来了前所未有的挑战。深信服安全应急响应中心&#xff08;以下简称“应急响应中心”&#xff09;编写了《网络安全事件应急指南》…...

通过smem 定时检测系统内存占用情况

编写定时任务脚本 cat >> /usr/local/bin/smem.sh <<-"EOF"if [[ ! -d /var/log/smem ]];thenmkdir -p /var/log/smem fi smem -tk >> /var/log/smem/smem.log EOFchmod 755 /usr/local/bin/smem.sh配置定时任务 echo "" >> /et…...

京准电钟:电厂自控NTP时间同步服务器技术方案

京准电钟&#xff1a;电厂自控NTP时间同步服务器技术方案 京准电钟&#xff1a;电厂自控NTP时间同步服务器技术方案 随着计算机和网络通信技术的飞速发展&#xff0c;火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分析和应用…...

Face to face

1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...

C语言中的文件操作:基础与实践

欢迎来到我的&#xff1a;世界 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言内容文件文件操作&#xff1a;数据库文件概述&#xff1a;文件的打开和关闭理解流的概念文件指针 文件的打开与关闭文件的读和写文件的顺序…...

从地铁客流讲开来:十二城日常地铁客运量特征

随着城市化进程的加速和人口的不断增长&#xff0c;公共交通系统在现代都市生活中扮演着日益重要的角色。地铁作为高效、环保的城市交通方式&#xff0c;已经成为居民日常出行不可或缺的一部分。本文聚焦于2024年10月28日至12月1日期间&#xff0c;对包括北上广深这四个超一线城…...

VMWare 的克隆操作

零、碎碎念 VMWare 的这个克隆操作很简单&#xff0c;单拎出来成贴的目的是方便后续使用。 一、操作步骤 1.1、在“源”服务器上点右键&#xff0c;选择“管理--克隆” 1.2、选择“虚拟机的当前状态”为基础制作克隆&#xff0c;如下图所示&#xff0c;然后点击“下一页” 1.3、…...

经济学 ppt 2 部分

前言 上一次复习经济学是好久之前了&#xff0c;看了第一章的 ppt &#xff0c;好像重点就是谁是软件经济学之父。昨天老师讲了一下题型&#xff0c;20 分选择题&#xff0c; 20 分判断题&#xff0c;20 分计算题&#xff0c;6 6 8 三个计算题&#xff0c;25 分表格&#xff0…...

R(4.4.2)的下载与安装(Windows系统)

进入官网&#xff1a;https://www.r-project.org/ 首先点击CRAN链接&#xff0c;选择一个镜像链接地址 进入CRAN所显示页面如下&#xff1a; 选择China下的一个镜像站点&#xff0c;本文选择第一个 选择windows系统下载 点击“base” 下载&#xff1a; 打开下载的文件 默认中文…...

一文流:JVM精讲(多图提醒⚠️)

一文流系列是作者苦于技术知识学了-忘了,背了-忘了的苦恼,决心把技术知识的要点一笔笔✍️出来,一图图画出来,一句句讲出来,以求刻在🧠里。 该系列文章会把核心要点提炼出来,以求掌握精髓,至于其他细节,写在文章里,留待后续回忆。 目前进度请查看: :::info https:/…...

C盘下的文件夹

在Windows操作系统中&#xff0c;C盘通常是系统安装的盘符&#xff0c;其中包含了许多重要的文件夹和系统文件。以下是一些常见的文件夹&#xff1a;系统文件夹 Windows: 包含Windows操作系统的核心文件和组件。 Program Files: 存储大多数安装的软件程序。 Program Files (x86…...

视频直播点播平台EasyDSS与无人机技术的森林防火融合应用

随着科技的飞速发展&#xff0c;无人机技术以其独特的优势在各个领域得到了广泛应用&#xff0c;特别是在森林防火这一关键领域&#xff0c;EasyDSS视频平台与无人机技术的融合应用更是为传统森林防火手段带来很大的变化。 一、无人机技术在森林防火中的优势 ‌1、快速响应与高…...

通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统

背景介绍 阿里云向量检索服务Milvus版&#xff08;简称阿里云Milvus&#xff09;是一款云上全托管服务&#xff0c;确保了了与开源Milvus的100%兼容性&#xff0c;并支持无缝迁移。在开源版本的基础上增强了可扩展性&#xff0c;能提供大规模 AI 向量数据的相似性检索服务。相…...

Unity 3D饼状图效果

一. 效果展示 二.基础类 using System.Collections; using System.Collections.Generic; using UnityEngine;public class DrawCylinder : MonoBehaviour {// 网格渲染器MeshRenderer meshRenderer;// 网格过滤器MeshFilter meshFilter;// 用来存放顶点数据List<Vector3>…...

OpenHarmony-4.HDI 框架

HDI 框架 1.HDI介绍 HDI&#xff08;Hardware Device Interface&#xff0c;硬件设备接口&#xff09;是HDF驱动框架为开发者提供的硬件规范化描述性接口&#xff0c;位于基础系统服务层和设备驱动层之间&#xff0c;是连通驱动程序和系统服务进行数据流通的桥梁&#xff0c;是…...

ArcGIS Pro 3.4新功能2:Spatial Analyst新特性,密度、距离、水文、太阳能、表面、区域分析

Spatial Analyst 扩展模块在 ArcGIS Pro 3.4 中引入了新功能和增强功能。此版本为您提供了用于表面和区域分析的新工具以及改进的密度和距离分析功能&#xff0c;多种用于水文分析的工具性能的提高&#xff0c;一些新的太阳能分析功能。 目录 1.密度分析 2.距离分析 3.水文…...

GitLab分支管理策略和最佳实践

分支管理是 Git 和 GitLab 中非常重要的部分&#xff0c;合理的分支管理可以帮助团队更高效地协作和开发。以下是一些细化的分支管理策略和最佳实践&#xff1a; 1. 分支命名规范 • 主分支&#xff1a;通常命名为 main 或 master&#xff0c;用于存放稳定版本的代码。 • …...

uniapp自定义树型结构数据弹窗,给默认选中的节点,禁用所有子节点

兼容H5、安卓App、微信小程序 实现逻辑&#xff1a;给默认选中节点的所有子节点添加一个disabled属性&#xff0c;以此禁用子节点。 /components/sonTreeNode/sonTreeNode.vue 封装成组件 <template><view><view :class"[item,item.is_level1?pL1:item…...

方正畅享全媒体新闻采编系统 screen.do SQL注入漏洞复现

0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…...

5G 模组 RG500Q常用AT命令

5G 模组 RG500Q常用AT命令 5G 模组 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…...

day38-SSH安全登录

机器准备 什么是SSH SSH 或 Secure Shell 协议是一种远程管理协议&#xff0c;允许用户通过 Internet 访问、控制和修改其远程服务器。 SSH 服务是作为未加密 Telnet 的安全替代品而创建的&#xff0c;它使用加密技术来确保进出远程服务器的所有通信都以加密方式进行。 SS…...