C++ Lambda表达式复习
C++ Lambda表达式 (C++ Lambda Expressions: Beginner to Advanced)
Lambda表达式是C++11引入的一种轻量级匿名函数语法,支持闭包捕获,可以简化代码逻辑,特别是在函数式编程、回调函数和STL算法场景中尤为常用。本文将从基础语法到高级应用,逐步详解Lambda表达式的使用方法和内部机制。
1. 基础语法 (Basic Syntax)
Lambda表达式的完整形式如下:
[捕获列表] (参数列表) -> 返回类型 { 函数体 }
- 捕获列表 (Capture List):指定Lambda中可以使用的外部变量。
- 参数列表 (Parameter List):与普通函数类似的参数列表。
- 返回类型 (Return Type):可选,省略时由编译器自动推导。
- 函数体 (Function Body):Lambda的主要逻辑代码。
示例:
auto lambda = [](int x, int y) -> int {return x + y;
};
std::cout << lambda(3, 4); // 输出: 7
2. 捕获列表详解 (Capture List Details)
捕获列表的作用是指定Lambda表达式中如何访问外部作用域变量。捕获可以按值或按引用进行,也可以混合使用。
捕获方式 (Capture Modes)
-
按值捕获(By Value)
- 捕获变量的值副本,Lambda内部的修改不会影响原变量。
- 使用
[x]
捕获单个变量,或[=]
捕获所有变量。
int a = 10; auto lambda = [a]() {std::cout << a << std::endl; // 输出: 10 }; a = 20; lambda(); // 输出仍然是10,因为捕获的是a的副本
-
按引用捕获(By Reference)
- 捕获变量的引用,Lambda内部的修改会影响原变量。
- 使用
[&x]
捕获单个变量,或[&]
捕获所有变量。
int b = 20; auto lambda = [&b]() {b += 10;std::cout << b << std::endl; // 修改b并输出: 30 }; lambda(); std::cout << b << std::endl; // 外部的b变为: 30
-
混合捕获(Mixed Capture)
- 可以同时使用按值捕获和按引用捕获。
- 示例:
[=, &y]
表示默认按值捕获,变量y
按引用捕获。
int x = 5, y = 10; auto lambda = [=, &y]() {// x是按值捕获,y是按引用捕获std::cout << "x: " << x << ", y: " << y << std::endl;y++; }; lambda(); std::cout << "y: " << y << std::endl; // y被修改为: 11
-
捕获this指针
[this]
捕获当前对象的指针,允许访问成员变量和成员函数。[=, this]
:按值捕获外部变量并捕获this
。
class Foo { public:int value = 42;auto getLambda() {return [this]() {std::cout << value << std::endl;};} }; Foo f; auto lambda = f.getLambda(); lambda(); // 输出: 42
-
初始化捕获(C++14起)
- 捕获列表支持直接初始化变量(即实现“捕获时初始化”)。
- 示例:
[z = a + 1]
。
int a = 10; auto lambda = [z = a + 1]() {std::cout << z << std::endl; // 输出: 11 }; lambda();
3. 参数列表与返回类型 (Parameter List & Return Type)
参数列表 (Parameter List)
Lambda表达式的参数列表与普通函数类似,但可以为任意类型。
auto add = [](int x, double y) {return x + y;
};
std::cout << add(3, 4.5); // 输出: 7.5
返回类型 (Return Type)
- 返回类型可以由编译器自动推导,通常无需显式声明。
- 如果需要显式指定返回类型,可以使用
->
。
auto divide = [](int x, int y) -> double {return static_cast<double>(x) / y;
};
std::cout << divide(10, 4); // 输出: 2.5
4. mutable关键字 (mutable Keyword)
默认情况下,按值捕获的变量在Lambda内部是只读的。如果需要修改这些值,可以使用mutable
关键字。
int count = 5;
auto lambda = [count]() mutable {count++;std::cout << count << std::endl; // 输出: 6
};
lambda();
std::cout << count << std::endl; // 外部的count仍然是: 5
5. STL中的应用 (Using Lambda with STL)
Lambda表达式在STL中非常实用,常用于算法如std::for_each
、std::find_if
、std::sort
等。
#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};// 使用Lambda打印所有元素std::for_each(nums.begin(), nums.end(), [](int num) {std::cout << num << " ";});std::cout << std::endl;// 使用Lambda查找第一个大于3的元素auto it = std::find_if(nums.begin(), nums.end(), [](int num) {return num > 3;});if (it != nums.end()) {std::cout << "First number > 3: " << *it << std::endl;}// 使用Lambda对元素排序(降序)std::sort(nums.begin(), nums.end(), [](int a, int b) {return a > b;});for (int x : nums) std::cout << x << " "; // 输出: 5 4 3 2 1return 0;
}
6. 泛型Lambda (Generic Lambda, C++14起)
C++14引入泛型Lambda,支持auto
作为参数类型占位符。
auto add = [](auto a, auto b) {return a + b;
};
std::cout << add(3, 4) << std::endl; // 输出: 7
std::cout << add(1.5, 2.5) << std::endl; // 输出: 4
7. Lambda递归 (Recursive Lambda)
由于Lambda表达式是匿名的,默认情况下无法直接递归调用。如果需要递归,可以使用std::function
。
#include <functional>
#include <iostream>std::function<int(int)> factorial = [&](int n) {return (n <= 1) ? 1 : n * factorial(n - 1);
};int main() {std::cout << "Factorial of 5: " << factorial(5) << std::endl; // 输出: 120return 0;
}
8. constexpr Lambda (C++17起)
C++17起,Lambda表达式可以被声明为constexpr
,支持编译期求值。
constexpr auto square = [](int x) {return x * x;
};
constexpr int result = square(5);
static_assert(result == 25, "Compile-time evaluation failed");
9. 捕获移动对象 (Capturing Move-Only Objects, C++14起)
从C++14开始,Lambda支持移动捕获,允许捕获独占资源(如智能指针)。
#include <memory>
#include <iostream>int main() {auto ptr = std::make_unique<int>(42);auto lambda = [p = std::move(ptr)]() {std::cout << *p << std::endl; // 输出: 42};lambda();return 0;
}
10. Lambda的类型与std::function (Lambda Type and std::function)
Lambda表达式的类型是匿名的,无法直接使用。如果需要存储到一个变量中并保持灵活性,可以使用std::function
。
#include <functional>std::function<int(int)> increment = [](int x) {return x + 1;
};
std::cout << increment(5) << std::endl; // 输出: 6
11. 注意事项与最佳实践 (Pitfalls & Best Practices)
-
悬垂引用(Dangling References)
- 捕获引用时要确保被引用的变量生命周期足够长,避免悬垂引用。
int* ptr = new int(10); auto lambda = [&]() { *ptr = 20; }; delete ptr; // 悬垂指针,lambda调用后可能导致未定义行为
-
按值捕获的副本
- 捕获的是变量的当前值,而非引用。
int x = 10; auto lambda = [x]() {std::cout << x << std::endl; }; x = 20; lambda(); // 输出: 10
-
复杂逻辑与可读性
- Lambda过于复杂时,建议改用普通函数,以提高代码可读性。
12. 总结与应用场景 (Summary and Use Cases)
Lambda表达式是C++现代编程的重要特性,其应用场景包括:
- STL算法:简化传递行为参数。
- 回调函数:处理异步任务或事件驱动。
- 函数组合:实现函数式编程的思想。
- 多线程:结合
std::thread
或std::async
。
C++ Lambda表达式题目
多选题 (Multiple Choice Questions)
1. 关于C++的Lambda表达式,以下哪些说法正确?(多选)
A. 使用[&]
捕获时,Lambda会按引用捕获所有变量。
B. Lambda表达式可以传递给STL算法作为参数。
C. Lambda表达式的类型是一个匿名类型,无法直接声明变量。
D. 在Lambda中修改按值捕获的变量需要加mutable
关键字。
2. 以下代码的输出结果是什么?(多选)
int a = 10, b = 20;
auto lambda = [=]() mutable {a++;b++;std::cout << a << " " << b << std::endl;
};
lambda();
std::cout << a << " " << b << std::endl;
A. 11 21
B. 10 20
C. 10 21
D. 11 20
3. 以下代码中,哪些捕获方式是合法的?(多选)
int x = 10, y = 20;
auto lambda1 = [x, &y]() {};
auto lambda2 = [&x, y]() {};
auto lambda3 = [=, &x]() {};
auto lambda4 = [&, x]() {};
A. lambda1
B. lambda2
C. lambda3
D. lambda4
4. 以下代码是否可以正确编译?如果不能,选择原因。(多选)
#include <memory>
auto ptr = std::make_unique<int>(42);
auto lambda = [p = std::move(ptr)]() {std::cout << *p << std::endl;
};
lambda();
A. 可以编译,输出42
B. 捕获列表中不能使用std::move
C. 捕获的p
生命周期错误
D. ptr
已经被移动,后续访问会出错
5. 如何在Lambda中实现递归调用?(多选)
A. 使用std::function
包装Lambda
B. 直接在Lambda中调用自身
C. 捕获Lambda的引用
D. Lambda递归只能通过外部普通函数实现
6. 以下哪些Lambda表达式是constexpr的?(多选)
auto lambda1 = [](int x) { return x * x; };
constexpr auto lambda2 = [](int x) { return x + x; };
auto lambda3 = [](int x) constexpr { return x - 1; };
auto lambda4 = []() { return 42; };
A. lambda1
B. lambda2
C. lambda3
D. lambda4
7. 以下代码的输出结果是什么?(多选)
int x = 10;
auto lambda = [x = x + 1]() {std::cout << x << std::endl;
};
x = 20;
lambda();
A. 10
B. 11
C. 20
D. 编译错误
8. 以下哪些场景适合使用Lambda表达式?(多选)
A. STL算法中的回调逻辑
B. 实现高性能递归函数
C. 并发编程中的线程入口函数
D. 定义大规模复杂的业务逻辑
9. 关于泛型Lambda,以下说法正确的是?(多选)
A. 泛型Lambda支持auto
作为参数类型
B. 泛型Lambda只能用于返回值是void
的函数
C. 泛型Lambda在C++14中引入
D. 泛型Lambda不能与其他捕获列表同时使用
10. 以下代码的输出结果是什么?(多选)
#include <vector>
#include <algorithm>
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};auto it = std::find_if(vec.begin(), vec.end(), [](int x) {return x > 3;});if (it != vec.end()) {std::cout << *it << std::endl;}return 0;
}
A. 3
B. 4
C. 5
D. 编译错误
设计题 (Design Questions)
1. 使用Lambda表达式实现一个通用的排序函数,支持升序和降序,并能够接受自定义比较器。
2. 设计一个简单的事件驱动系统,使用Lambda表达式注册事件回调并触发事件。
3. 使用Lambda表达式实现一个轻量级的任务调度器,能够按照优先级执行任务。
4. 使用Lambda表达式和std::function
实现一个可以递归计算斐波那契数列的函数,并支持自定义初始值。
5. 使用Lambda表达式设计一个简单的资源管理类,能够自动释放资源(如文件或内存),支持自定义释放逻辑。
答案与详解 (Answers and Explanations)
多选题答案
-
正确答案:A, B, C, D
- A:
[&]
按引用捕获所有外部变量。 - B: Lambda可以作为函数对象传递给STL算法。
- C: Lambda的类型是匿名的,只能通过
auto
或std::function
存储。 - D: 按值捕获的变量是只读的,使用
mutable
可以修改其副本。
- A:
-
正确答案:A, B
- Lambda内部
a
和b
是按值捕获的副本,修改不会影响外部变量。 - 输出分别是
11 21
(Lambda内部)和10 20
(外部)。
- Lambda内部
-
正确答案:A, B, D
- A: 按值捕获
x
和按引用捕获y
是合法的。 - B: 合法,因为引用捕获
x
、按值捕获y
。 - C:
[=, &x]
是非法的,不能混用=
和具体按引用捕获。 - D: 合法,
[&, x]
允许按值捕获x
。
- A: 按值捕获
-
正确答案:A
- 代码合法,运行时输出
42
,因为std::move
捕获将所有权转移到Lambda内部。
- 代码合法,运行时输出
-
正确答案:A, C
- A: 使用
std::function
封装Lambda支持递归。 - C: 捕获Lambda的引用也可以实现递归。
- A: 使用
-
正确答案:B, C
- B:
constexpr
修饰Lambda表达式。 - C: Lambda内部声明为
constexpr
。
- B:
-
正确答案:B
- 捕获列表
x = x + 1
初始化了x
为11
,后续修改外部x
不影响。
- 捕获列表
-
正确答案:A, C
- A: Lambda常用于STL算法,如
std::for_each
。 - C: 并发编程中,Lambda可作为线程入口。
- A: Lambda常用于STL算法,如
-
正确答案:A, C
- A: 泛型Lambda支持
auto
作为参数类型。 - C: 泛型Lambda在C++14中引入。
- A: 泛型Lambda支持
-
正确答案:B
- Lambda表达式找到第一个大于3的元素,输出
4
。
设计题详解
1. 通用排序函数
#include <vector>
#include <algorithm>template<typename T, typename Compare = std::less<T>>
void sort(std::vector<T>& vec, Compare comp = Compare()) {std::sort(vec.begin(), vec.end(), comp);
}int main() {std::vector<int> vec = {5, 2, 8, 1};sort(vec, [](int a, int b) { return a > b; }); // 降序return 0;
}
2. 事件驱动系统
#include <functional>
#include <unordered_map>
#include <vector>class EventSystem {
public:using Callback = std::function<void()>;void registerEvent(const std::string& eventName, Callback callback) {events[eventName].push_back(callback);}void trigger(const std::string& eventName) {for (auto& callback : events[eventName]) {callback();}}
private:std::unordered_map<std::string, std::vector<Callback>> events;
};
3. 任务调度器
#include <queue>
#include <functional>class TaskScheduler {
public:using Task = std::function<void()>;void addTask(Task task, int priority) {tasks.emplace(priority, task);}void run() {while (!tasks.empty()) {auto [priority, task] = tasks.top();task();tasks.pop();}}
private:std::priority_queue<std::pair<int, Task>> tasks;
};
4. 递归计算斐波那契数列
#include <functional>
#include <iostream>std::function<int(int)> createFibonacci(int a = 0, int b = 1) {return [=](int n) mutable {if (n == 0) return a;if (n == 1) return b;return createFibonacci(b, a + b)(n - 1);};
}
5. 资源管理类
#include <functional>
#include <iostream>class ResourceManager {
public:ResourceManager(std::function<void()> release) : releaseFunc(release) {}~ResourceManager() { releaseFunc(); }
private:std::function<void()> releaseFunc;
};
相关文章:
C++ Lambda表达式复习
C Lambda表达式 (C Lambda Expressions: Beginner to Advanced) Lambda表达式是C11引入的一种轻量级匿名函数语法,支持闭包捕获,可以简化代码逻辑,特别是在函数式编程、回调函数和STL算法场景中尤为常用。本文将从基础语法到高级应用&#x…...
鸿蒙NEXT开发权限工具类(申请授权相关)(ArkTs)
import abilityAccessCtrl, { Permissions } from ohos.abilityAccessCtrl; import { bundleManager, common, PermissionRequestResult } from kit.AbilityKit; import { BusinessError } from ohos.base; import { ToastUtil } from ./ToastUtil;/*** 权限工具类(…...
1000 QPS 下 MySQL 性能瓶颈解决方案
当 MySQL 在 1000 QPS 时出现性能瓶颈,需从索引优化、查询逻辑调整、服务器配置调优、架构扩展等多维度综合解决,具体策略如下: 一、索引优化 补充缺失索引 通过慢查询日志定位高频低效 SQL,使用 EXPLAIN 分…...
【MySQL】MySQL 表的增删改查(CRUD)—— 下篇(内含聚合查询、group by和having子句、联合查询、插入查询结果)
目录 1. 插入查询结果 2 聚合查询 (行与行之间运算) count 计算查询结果的行数 sum 求和 avg 求平均值 max 最大值 min 最小值 【小结】 3. group by 子句 分组 where 条件 having 条件 4. 联合查询(多表查询) 内连接…...
简化K8S部署流程:通过Apisix实现蓝绿发布策略详解(上)
本次主题主要目的是为大家讲解蓝绿发布,但是发现文档和内容太长了,对此将文档拆分成了两部分,视频拆分成了好几部分,这样大家刷起来没疲劳感。 第一部分《apisix argorollout 实现蓝绿发布I-使用apisix发布应用》,主要…...
FLV 与 MP4 格式深度剖析:结构、原理
1 FLV格式分析 1.1 定义 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv FLV封装格式是由⼀个**⽂件…...
k8s的yaml文件里的volume跟volumeMount的区别
volume 是 Pod 级别的资源,用于定义存储卷。它是一个独立于容器的存储资源,可以被一个或多个容器共享使用。volume 的定义位于 Pod 的 spec.volumes 部分。 特点 独立性:volume 是 Pod 的一部分,而不是容器的一部分。它独立于容…...
Git常用操作命令
配置 Git git config --global user.name "Your Name": 设置用户名。git config --global user.email "your_emailexample.com": 设置用户邮箱。 初始化和克隆仓库 git init: 初始化一个新的 Git 仓库。git clone [URL]: 克隆一个远程仓库到本地。 git cl…...
09.传输层协议 ——— TCP协议
文章目录 TCP协议 谈谈可靠性TCP协议格式 序号与确认序号窗口大小六个标志位 确认应答机制(ACK)超时重传机制连接管理机制 三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议 TCP协…...
NineData 与飞书深度集成,企业级数据管理审批流程全面自动化
NineData 正式推出与飞书审批系统的深度集成功能,企业用户在 NineData 平台发起的审批工单,将自动推送至审批人的飞书中,审批人可以直接在飞书进行审批并通过/拒绝。该功能实现跨系统协作,带来巨大的审批效率提升,为各…...
WebRTC服务器Coturn服务器中的通信协议
1、概述 作为WebRTC服务器,coturn通信协议主要是STUN和TURN协议 STUN&TURN协议头部都是20个字节,用 Message Type来区分不同的协议 |------2------|------2------|------------4------------|------------------------12-------------------------|-----------…...
4.19除自身以外数组的乘积
我自己的思路,想用双指针, 一个从左边left开始乘,一个从右边right开始乘,如果left,或者right遇到了目标索引i(也就是我们要跨过去的当前元素),那么直接让对应的指针加一,当前元素不参与累积的计算ÿ…...
Anaconda3使用conda进行包管理
一、基础包管理操作 安装包 使用 conda install <包名> 安装指定包,支持多包批量安装和版本指定: conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...
媒体关注:联易融聚焦AI+业务,重塑供应链金融生态
近日,供应链金融科技龙头企业联易融科技集团(以下简称“联易融”)发布的公告显示,截至2024年末,公司现金储备达51亿元,同比上一年增加2亿元。公司称,公司经营性现金流保持健康,现金储…...
安装 Conda 环境
安装 Conda 环境:快速指南 什么是 Conda? Conda 是一个开源的跨平台包管理器和环境管理系统,支持 Python、R、Julia 等语言。它广泛用于数据科学和机器学习领域,能够轻松创建、管理和切换开发环境。 安装步骤 1. 安装 Anaconda…...
Qt Creator 创建 Qt Quick Application一些问题
一、Qt Creator 创建 Qt Quick Application 时无法选择 MSVC 编译器(即使已安装 Qt 5.15.2 和 MSVC2019) 1、打开 Qt Creator 的编译器设置 工具 (Tools) → 选项 (Options) → Kits → 编译器 (Compilers) 检查是否存在 Microsoft Visual C++ Compiler (x86_amd64) 或类似条…...
Spark-Streaming核心编程
以下是今天所学的知识点与代码测试: Spark-Streaming DStream实操 案例一:WordCount案例 需求:使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并统计不同单词出现的次数 实验步骤:…...
深度剖析神经网络:从基础原理到面试要点(二)
引言 在人工智能蓬勃发展的今天,神经网络作为其核心技术之一,广泛应用于图像识别、自然语言处理、语音识别等众多领域。深入理解神经网络的数学模型和结构,对于掌握人工智能技术至关重要。本文将对神经网络的关键知识点进行详细解析…...
c#操作excel
说明 vs2022开发,调用excel 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Sy…...
MQTTX + MCP:MQTT 客户端秒变物联网 Agent
引言:MQTTX 与 MCP 的融合 作为最受欢迎的 MQTT 客户端工具,MQTTX 在 1.12.0 beta 版本中集成了模型上下文协议(MCP)到 Copilot AI 功能中,显著提升了服务能力。这一融合让 MQTTX 转变为 MCP Host(也就是发…...
GSAP 动画引擎实战:打造丝滑动效交互组件库
目录 一、前言二、项目初始化三、核心动效组件实战1. 元素淡入组件:FadeIn.vue2. 列表级联动画:SlideList.vue3. 滚动触发 Reveal 动画:ScrollReveal.vue4. 拖拽盒子组件:DraggableBox.vue5. 打字机效果组件:Typewrite…...
[OpenGL] Lambertian材质漫反射BRDF方程的解释与推导
一、简介 本文简单的介绍了 Physical Based Rendering, PBR 中的 Lambertian 材质漫反射BRDF公式 f r l a m b e r t i a n c d i f f π fr_{lambertian}\frac{c_{diff}}{\pi} frlambertianπcdiff的推导。 二、漫反射项 根据 渲染方程: L o ( v ) ∫ …...
网易云音乐如何修改缓存地址到D盘
你可以通过创建 符号链接(Symbolic Link) 将网易云音乐的缓存目录转移到D盘,无需修改软件设置。以下是具体步骤: 操作步骤 关闭网易云音乐 确保程序完全退出(任务栏右下角无残留进程)。 备份并移动原缓存文…...
react使用01
React.cloneElement(element,props,…children) 这个是React的官方API,,主要用于克隆并修改React元素,, 本质: 复制一个已有的React元素,并允许你修改他的props element : 必须是一个有效的element元素p…...
yooAsset打包后材质丢失
以安卓为目标平台打出的AssetBundle包(尤其是YooAsset打出的),在Window下Unity编辑器以HostPlayMode运行,有时显示会丢失部分材质。 这是因为安卓目标的AssetBundle包适合OpenglES,而window下Unity编辑器模式是Dx11&a…...
Codeforces Round 1019 (Div. 2)
A. Common Multiple 找不同的数字 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {int t; cin >> t;while (t--) {int n;cin >> n;vector<int> a(n);for (int i 0; i < n; i)cin >&…...
【Spring Boot】MyBatis多表查询的操作:注解和XML实现SQL语句
1.准备工作 1.1创建数据库 (1)创建数据库: CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;(2)使用数据库 -- 使⽤数据数据 USE mybatis_test;1.2 创建用户表和实体类 创建用户表 -- 创建表[⽤⼾表…...
Docker离线安装与配置指南
Docker离线安装与配置指南 离线安装步骤 1. 下载离线安装包 官方下载地址: https://download.docker.com/linux/static/stable/x86_64/注意:国内用户若无法访问,可能需要使用科学上网工具。本文档以Docker 20.10.23版本为例。 2. 安装与部…...
N8N 官方 MCP 节点实战指南:AI 驱动下的多工具协同应用场景全解析
在低代码自动化领域,N8N 凭借其强大的节点扩展能力和灵活的工作流编排,成为企业构建复杂自动化流程的首选工具。随着 AI Agent 技术的兴起,通过 MCP(Multi-Tool Coordination Protocol)实现 AI 与外部工具的协同调用&a…...
v-html 显示富文本内容
返回数据格式: 只有图片名称 显示不出完整路径 解决方法:在接收数据后手动给img格式的拼接vite.config中的服务器地址 页面: <el-button click"">获取信息<el-button><!-- 弹出层 --> <el-dialog v-model&…...
UWB与GPS技术融合的室内外无缝定位方案
一、技术原理与互补性 双模定位机制 室外场景:GPS/北斗提供10-30厘米级定位精度(RTK技术辅助),覆盖露天区域。室内场景:UWB通过TOF/TDOA算法实现10-50厘米级定位精度,穿透金…...
AiEditor v1.3.8 发布
2025 年 4 月 22 日,AI 富文本编辑器 AiEditor 发布了 v1.3.8 版本。 AiEditor 是一个面向 AI 的下一代富文本编辑器,基于 Web Component 开发,支持 Layui、Vue、React、Angular 等几乎任何前端框架,适配 PC Web 端和手机端&#…...
从零学会epoll的使用和原理
从零学会epoll的使用和原理 第一步:理解 select / poll 的缺陷 一、select 和 poll 是什么? 它们是 Linux 提供的 I/O 多路复用机制,可以让我们同时监听多个文件描述符(fd),比如 socket,来等…...
XHTMLConverter把docx转换html报java.lang.NullPointerException异常
一.报错 1.报错信息 org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerExceptionat org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConve…...
教育科技质检的三重挑战 质检LIMS系统在教育技术研发的应用
在教育技术研发领域,实验室作为产品验证的核心环节,其质检效率与数据安全性直接关乎企业的创新竞争力。LIMS(实验室信息管理系统)作为贯穿检测全流程的数字化中枢,正在成为教育科技企业的"质量守护者"。本文…...
MySQL最左前缀原则深度解析:优化索引设计的核心法则
一、什么是最左前缀原则? 最左前缀原则(Leftmost Prefix Principle) 指在使用复合索引(Composite Index)时,MySQL会按照索引定义的列顺序,从左到右匹配查询条件。只有连续且从最左侧开始的列组…...
多模态大语言模型arxiv论文略读(三十五)
On the Out-Of-Distribution Generalization of Multimodal Large Language Models ➡️ 论文标题:On the Out-Of-Distribution Generalization of Multimodal Large Language Models ➡️ 论文作者:Xingxuan Zhang, Jiansheng Li, Wenjing Chu, Junjia…...
Linux 安装pm2并全局可用
前言 本文基于:操作系统 CentOS Stream 8 使用工具:Xshell8、Xftp8 服务器基础环境: node - 请查看 Linux安装node并全局可用 所需服务器基础环境,请根据提示进行下载、安装。 1.安装依赖 npm install pm2 -g2.配置全局软链…...
39.剖析无处不在的数据结构
数据结构是计算机中组织和存储数据的特定方式,它的目的是方便且高效地对数据进行访问和修改。数据结构表述了数据之间的关系,以及操作数据的一系列方法。数据又是程序的基本单元,因此无论是哪种语言、哪种领域,都离不开数据结构&a…...
基于 Vue 的Tiptap 富文本编辑器使用指南
目录 🧰 技术栈 📦 所需依赖 📁 文件结构 🧱 编辑器组件实现(components/Editor.vue) ✨ 常用操作指令 🧠 小贴士 🧩 Tiptap 扩展功能使用说明(含快捷键与命令&am…...
【音视频】AAC-ADTS分析
AAC-ADTS 格式分析 AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主 要的贡献者。 ADIF:Audio Data Interchange Format ⾳…...
vue中将elementUI和echarts转成pdf文件
若要将包含 ElementUI 组件数据和多个 ECharts 图表的数据转换为 PDF 文档,可结合 html2canvas、jspdf 以及 dom-to-image 来实现。其中,html2canvas 和 dom-to-image 可将 ECharts 图表转换为图片,jspdf 则用于生成 PDF 文档。对于 ElementU…...
基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现
基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域,高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…...
本地部署DeepSeek-R1模型接入PyCharm
以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 下载安装包 访问Ollama官网(https://ollama.com/download)或通过视频提供的百度云盘链接下载对应系统的安装包。Windows用户…...
基于LightGBM-TPE算法对交通事故严重程度的分析与可视化
基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文: Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因,引起了多学科领域的关注。分析事故严重性特…...
音视频小白系统入门课-3
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2 视频: 由一组图像组成:像素、分辨率、RGB 8888(24位) 、RGBA(32位)为…...
考研系列-计算机网络-第五章、传输层
一、传输层提供的服务 1.重点知识...
将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境中
需求:关于如何将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境test2里,而且他们提到用requirements.txt 安装一直报错,所以想尝试直接拷贝的方法。 可以尝试通过直接拷贝移植的方式迁移Python环境到Anaconda虚拟环境,但…...
AI 数字短视频数字人源码开发:多维赋能短视频生态革新
在短视频行业深度发展的进程中,AI 数字短视频数字人源码开发凭借其独特的技术优势,从多个维度为行业生态带来了革命性的变化,重塑短视频创作、传播与应用的格局。 数据驱动,实现内容精准化创作 AI 数字短视频数字人源码开发能够深…...
ffmpeg 硬解码相关知识
一:FFMPEG 支持的硬解方式:如下都是了解知识 DXVA2 - windows DXVA2 硬件加速技术解析 一、核心特性与适用场景 技术定义:DXVA2(DirectX Video Acceleration 2)是微软推出的基于 DirectX 的硬件加速标准…...