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

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)

  1. 按值捕获(By Value)

    • 捕获变量的值副本,Lambda内部的修改不会影响原变量。
    • 使用[x]捕获单个变量,或[=]捕获所有变量。
    int a = 10;
    auto lambda = [a]() {std::cout << a << std::endl; // 输出: 10
    };
    a = 20;
    lambda(); // 输出仍然是10,因为捕获的是a的副本
    
  2. 按引用捕获(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
    
  3. 混合捕获(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
    
  4. 捕获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
    
  5. 初始化捕获(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_eachstd::find_ifstd::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)

  1. 悬垂引用(Dangling References)

    • 捕获引用时要确保被引用的变量生命周期足够长,避免悬垂引用。
    int* ptr = new int(10);
    auto lambda = [&]() { *ptr = 20; };
    delete ptr; // 悬垂指针,lambda调用后可能导致未定义行为
    
  2. 按值捕获的副本

    • 捕获的是变量的当前值,而非引用。
    int x = 10;
    auto lambda = [x]() {std::cout << x << std::endl;
    };
    x = 20;
    lambda(); // 输出: 10
    
  3. 复杂逻辑与可读性

    • Lambda过于复杂时,建议改用普通函数,以提高代码可读性。

12. 总结与应用场景 (Summary and Use Cases)

Lambda表达式是C++现代编程的重要特性,其应用场景包括:

  • STL算法:简化传递行为参数。
  • 回调函数:处理异步任务或事件驱动。
  • 函数组合:实现函数式编程的思想。
  • 多线程:结合std::threadstd::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)

多选题答案

  1. 正确答案:A, B, C, D

    • A: [&]按引用捕获所有外部变量。
    • B: Lambda可以作为函数对象传递给STL算法。
    • C: Lambda的类型是匿名的,只能通过autostd::function存储。
    • D: 按值捕获的变量是只读的,使用mutable可以修改其副本。
  2. 正确答案:A, B

    • Lambda内部ab是按值捕获的副本,修改不会影响外部变量。
    • 输出分别是11 21(Lambda内部)和10 20(外部)。
  3. 正确答案:A, B, D

    • A: 按值捕获x和按引用捕获y是合法的。
    • B: 合法,因为引用捕获x、按值捕获y
    • C: [=, &x]是非法的,不能混用=和具体按引用捕获。
    • D: 合法,[&, x]允许按值捕获x
  4. 正确答案:A

    • 代码合法,运行时输出42,因为std::move捕获将所有权转移到Lambda内部。
  5. 正确答案:A, C

    • A: 使用std::function封装Lambda支持递归。
    • C: 捕获Lambda的引用也可以实现递归。
  6. 正确答案:B, C

    • B: constexpr修饰Lambda表达式。
    • C: Lambda内部声明为constexpr
  7. 正确答案:B

    • 捕获列表x = x + 1初始化了x11,后续修改外部x不影响。
  8. 正确答案:A, C

    • A: Lambda常用于STL算法,如std::for_each
    • C: 并发编程中,Lambda可作为线程入口。
  9. 正确答案:A, C

    • A: 泛型Lambda支持auto作为参数类型。
    • C: 泛型Lambda在C++14中引入。
  10. 正确答案: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引入的一种轻量级匿名函数语法&#xff0c;支持闭包捕获&#xff0c;可以简化代码逻辑&#xff0c;特别是在函数式编程、回调函数和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;/*** 权限工具类&#xff08;…...

1000 QPS 下 MySQL 性能瓶颈解决方案

当 MySQL 在 1000 QPS 时出现性能瓶颈&#xff0c;需从‌索引优化‌、‌查询逻辑调整‌、‌服务器配置调优‌、‌架构扩展‌等多维度综合解决&#xff0c;具体策略如下&#xff1a; 一、索引优化 补充缺失索引‌ 通过慢查询日志定位高频低效 SQL&#xff0c;使用 EXPLAIN 分…...

【MySQL】MySQL 表的增删改查(CRUD)—— 下篇(内含聚合查询、group by和having子句、联合查询、插入查询结果)

目录 1. 插入查询结果 2 聚合查询 &#xff08;行与行之间运算&#xff09; count 计算查询结果的行数 sum 求和 avg 求平均值 max 最大值 min 最小值 【小结】 3. group by 子句 分组 where 条件 having 条件 4. 联合查询&#xff08;多表查询&#xff09; 内连接…...

简化K8S部署流程:通过Apisix实现蓝绿发布策略详解(上)

本次主题主要目的是为大家讲解蓝绿发布&#xff0c;但是发现文档和内容太长了&#xff0c;对此将文档拆分成了两部分&#xff0c;视频拆分成了好几部分&#xff0c;这样大家刷起来没疲劳感。 第一部分《apisix argorollout 实现蓝绿发布I-使用apisix发布应用》&#xff0c;主要…...

FLV 与 MP4 格式深度剖析:结构、原理

1 FLV格式分析 1.1 定义 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv FLV封装格式是由⼀个**⽂件…...

k8s的yaml文件里的volume跟volumeMount的区别

volume 是 Pod 级别的资源&#xff0c;用于定义存储卷。它是一个独立于容器的存储资源&#xff0c;可以被一个或多个容器共享使用。volume 的定义位于 Pod 的 spec.volumes 部分。 特点 独立性&#xff1a;volume 是 Pod 的一部分&#xff0c;而不是容器的一部分。它独立于容…...

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协议格式 序号与确认序号窗口大小六个标志位 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制 三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议 TCP协…...

NineData 与飞书深度集成,企业级数据管理审批流程全面自动化

NineData 正式推出与飞书审批系统的深度集成功能&#xff0c;企业用户在 NineData 平台发起的审批工单&#xff0c;将自动推送至审批人的飞书中&#xff0c;审批人可以直接在飞书进行审批并通过/拒绝。该功能实现跨系统协作&#xff0c;带来巨大的审批效率提升&#xff0c;为各…...

WebRTC服务器Coturn服务器中的通信协议

1、概述 作为WebRTC服务器&#xff0c;coturn通信协议主要是STUN和TURN协议 STUN&TURN协议头部都是20个字节,用 Message Type来区分不同的协议 |------2------|------2------|------------4------------|------------------------12-------------------------|-----------…...

4.19除自身以外数组的乘积

我自己的思路&#xff0c;想用双指针&#xff0c; 一个从左边left开始乘&#xff0c;一个从右边right开始乘&#xff0c;如果left,或者right遇到了目标索引i(也就是我们要跨过去的当前元素)&#xff0c;那么直接让对应的指针加一&#xff0c;当前元素不参与累积的计算&#xff…...

Anaconda3使用conda进行包管理

一、基础包管理操作 ‌安装包‌ 使用 conda install <包名> 安装指定包&#xff0c;支持多包批量安装和版本指定&#xff1a; conda install numpy # 安装单个包 conda install numpy scipy pandas # 批量安装多个包 conda install numpy1.21 # 指定版本 conda instal…...

媒体关注:联易融聚焦AI+业务,重塑供应链金融生态

近日&#xff0c;供应链金融科技龙头企业联易融科技集团&#xff08;以下简称“联易融”&#xff09;发布的公告显示&#xff0c;截至2024年末&#xff0c;公司现金储备达51亿元&#xff0c;同比上一年增加2亿元。公司称&#xff0c;公司经营性现金流保持健康&#xff0c;现金储…...

安装 Conda 环境

安装 Conda 环境&#xff1a;快速指南 什么是 Conda&#xff1f; Conda 是一个开源的跨平台包管理器和环境管理系统&#xff0c;支持 Python、R、Julia 等语言。它广泛用于数据科学和机器学习领域&#xff0c;能够轻松创建、管理和切换开发环境。 安装步骤 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核心编程

以下是今天所学的知识点与代码测试&#xff1a; Spark-Streaming DStream实操 案例一&#xff1a;WordCount案例 需求&#xff1a;使用 netcat 工具向 9999 端口不断的发送数据&#xff0c;通过 SparkStreaming 读取端口数据并统计不同单词出现的次数 实验步骤&#xff1a;…...

深度剖析神经网络:从基础原理到面试要点(二)

引言 在人工智能蓬勃发展的今天&#xff0c;神经网络作为其核心技术之一&#xff0c;广泛应用于图像识别、自然语言处理、语音识别等众多领域。深入理解神经网络的数学模型和结构&#xff0c;对于掌握人工智能技术至关重要。本文将对神经网络的关键知识点进行详细解析&#xf…...

c#操作excel

说明 vs2022开发&#xff0c;调用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

引言&#xff1a;MQTTX 与 MCP 的融合 作为最受欢迎的 MQTT 客户端工具&#xff0c;MQTTX 在 1.12.0 beta 版本中集成了模型上下文协议&#xff08;MCP&#xff09;到 Copilot AI 功能中&#xff0c;显著提升了服务能力。这一融合让 MQTTX 转变为 MCP Host&#xff08;也就是发…...

GSAP 动画引擎实战:打造丝滑动效交互组件库

目录 一、前言二、项目初始化三、核心动效组件实战1. 元素淡入组件&#xff1a;FadeIn.vue2. 列表级联动画&#xff1a;SlideList.vue3. 滚动触发 Reveal 动画&#xff1a;ScrollReveal.vue4. 拖拽盒子组件&#xff1a;DraggableBox.vue5. 打字机效果组件&#xff1a;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​​的推导。 二、漫反射项 根据 渲染方程&#xff1a; L o ( v ) ∫ …...

网易云音乐如何修改缓存地址到D盘

你可以通过创建 符号链接&#xff08;Symbolic Link&#xff09; 将网易云音乐的缓存目录转移到D盘&#xff0c;无需修改软件设置。以下是具体步骤&#xff1a; 操作步骤 关闭网易云音乐 确保程序完全退出&#xff08;任务栏右下角无残留进程&#xff09;。 备份并移动原缓存文…...

react使用01

React.cloneElement(element,props,…children) 这个是React的官方API&#xff0c;&#xff0c;主要用于克隆并修改React元素&#xff0c;&#xff0c; 本质&#xff1a; 复制一个已有的React元素&#xff0c;并允许你修改他的props element : 必须是一个有效的element元素p…...

yooAsset打包后材质丢失

以安卓为目标平台打出的AssetBundle包&#xff08;尤其是YooAsset打出的&#xff09;&#xff0c;在Window下Unity编辑器以HostPlayMode运行&#xff0c;有时显示会丢失部分材质。 这是因为安卓目标的AssetBundle包适合OpenglES&#xff0c;而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创建数据库 &#xff08;1&#xff09;创建数据库&#xff1a; CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;&#xff08;2&#xff09;使用数据库 -- 使⽤数据数据 USE mybatis_test;1.2 创建用户表和实体类 创建用户表 -- 创建表[⽤⼾表…...

Docker离线安装与配置指南

Docker离线安装与配置指南 离线安装步骤 1. 下载离线安装包 官方下载地址&#xff1a; https://download.docker.com/linux/static/stable/x86_64/注意&#xff1a;国内用户若无法访问&#xff0c;可能需要使用科学上网工具。本文档以Docker 20.10.23版本为例。 2. 安装与部…...

N8N 官方 MCP 节点实战指南:AI 驱动下的多工具协同应用场景全解析

在低代码自动化领域&#xff0c;N8N 凭借其强大的节点扩展能力和灵活的工作流编排&#xff0c;成为企业构建复杂自动化流程的首选工具。随着 AI Agent 技术的兴起&#xff0c;通过 MCP&#xff08;Multi-Tool Coordination Protocol&#xff09;实现 AI 与外部工具的协同调用&a…...

v-html 显示富文本内容

返回数据格式&#xff1a; 只有图片名称 显示不出完整路径 解决方法&#xff1a;在接收数据后手动给img格式的拼接vite.config中的服务器地址 页面&#xff1a; <el-button click"">获取信息<el-button><!-- 弹出层 --> <el-dialog v-model&…...

UWB与GPS技术融合的室内外无缝定位方案

‌ 一、技术原理与互补性‌ ‌双模定位机制‌ ‌室外场景‌&#xff1a;GPS/北斗提供‌10-30厘米级定位精度‌&#xff08;RTK技术辅助&#xff09;&#xff0c;覆盖露天区域。‌室内场景‌&#xff1a;UWB通过‌TOF/TDOA算法‌实现‌10-50厘米级定位精度‌&#xff0c;穿透金…...

AiEditor v1.3.8 发布

2025 年 4 月 22 日&#xff0c;AI 富文本编辑器 AiEditor 发布了 v1.3.8 版本。 AiEditor 是一个面向 AI 的下一代富文本编辑器&#xff0c;基于 Web Component 开发&#xff0c;支持 Layui、Vue、React、Angular 等几乎任何前端框架&#xff0c;适配 PC Web 端和手机端&#…...

从零学会epoll的使用和原理

从零学会epoll的使用和原理 第一步&#xff1a;理解 select / poll 的缺陷 一、select 和 poll 是什么&#xff1f; 它们是 Linux 提供的 I/O 多路复用机制&#xff0c;可以让我们同时监听多个文件描述符&#xff08;fd&#xff09;&#xff0c;比如 socket&#xff0c;来等…...

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系统在教育技术研发的应用

在教育技术研发领域&#xff0c;实验室作为产品验证的核心环节&#xff0c;其质检效率与数据安全性直接关乎企业的创新竞争力。LIMS&#xff08;实验室信息管理系统&#xff09;作为贯穿检测全流程的数字化中枢&#xff0c;正在成为教育科技企业的"质量守护者"。本文…...

MySQL最左前缀原则深度解析:优化索引设计的核心法则

一、什么是最左前缀原则&#xff1f; 最左前缀原则&#xff08;Leftmost Prefix Principle&#xff09; 指在使用复合索引&#xff08;Composite Index&#xff09;时&#xff0c;MySQL会按照索引定义的列顺序&#xff0c;从左到右匹配查询条件。只有连续且从最左侧开始的列组…...

多模态大语言模型arxiv论文略读(三十五)

On the Out-Of-Distribution Generalization of Multimodal Large Language Models ➡️ 论文标题&#xff1a;On the Out-Of-Distribution Generalization of Multimodal Large Language Models ➡️ 论文作者&#xff1a;Xingxuan Zhang, Jiansheng Li, Wenjing Chu, Junjia…...

Linux 安装pm2并全局可用

前言 本文基于&#xff1a;操作系统 CentOS Stream 8 使用工具&#xff1a;Xshell8、Xftp8 服务器基础环境&#xff1a; node - 请查看 Linux安装node并全局可用 所需服务器基础环境&#xff0c;请根据提示进行下载、安装。 1.安装依赖 npm install pm2 -g2.配置全局软链…...

39.剖析无处不在的数据结构

数据结构是计算机中组织和存储数据的特定方式&#xff0c;它的目的是方便且高效地对数据进行访问和修改。数据结构表述了数据之间的关系&#xff0c;以及操作数据的一系列方法。数据又是程序的基本单元&#xff0c;因此无论是哪种语言、哪种领域&#xff0c;都离不开数据结构&a…...

基于 Vue 的Tiptap 富文本编辑器使用指南

目录 &#x1f9f0; 技术栈 &#x1f4e6; 所需依赖 &#x1f4c1; 文件结构 &#x1f9f1; 编辑器组件实现&#xff08;components/Editor.vue&#xff09; ✨ 常用操作指令 &#x1f9e0; 小贴士 &#x1f9e9; Tiptap 扩展功能使用说明&#xff08;含快捷键与命令&am…...

【音视频】AAC-ADTS分析

AAC-ADTS 格式分析 AAC⾳频格式&#xff1a;Advanced Audio Coding(⾼级⾳频解码)&#xff0c;是⼀种由MPEG-4标准定义的有损⾳频压缩格式&#xff0c;由Fraunhofer发展&#xff0c;Dolby, Sony和AT&T是主 要的贡献者。 ADIF&#xff1a;Audio Data Interchange Format ⾳…...

vue中将elementUI和echarts转成pdf文件

若要将包含 ElementUI 组件数据和多个 ECharts 图表的数据转换为 PDF 文档&#xff0c;可结合 html2canvas、jspdf 以及 dom-to-image 来实现。其中&#xff0c;html2canvas 和 dom-to-image 可将 ECharts 图表转换为图片&#xff0c;jspdf 则用于生成 PDF 文档。对于 ElementU…...

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案:涵盖画布系统到数据持久化的完整实现

基于 Electron、Vue3 和 TypeScript 的辅助创作工具全链路开发方案&#xff1a;涵盖画布系统到数据持久化的完整实现 引言 在数字内容创作领域&#xff0c;高效的辅助工具是连接创意与实现的关键桥梁。创作者需要一款集可视化画布、节点关系管理、数据持久化于一体的专业工具&…...

本地部署DeepSeek-R1模型接入PyCharm

以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 ​下载安装包 访问Ollama官网(https://ollama.com/download)或通过视频提供的百度云盘链接下载对应系统的安装包。Windows用户…...

基于LightGBM-TPE算法对交通事故严重程度的分析与可视化

基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文&#xff1a; Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因&#xff0c;引起了多学科领域的关注。分析事故严重性特…...

音视频小白系统入门课-3

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 往期课程笔记传送门&#xff1a; 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2 视频&#xff1a; 由一组图像组成&#xff1a;像素、分辨率、RGB 8888(24位) 、RGBA(32位)为…...

考研系列-计算机网络-第五章、传输层

一、传输层提供的服务 1.重点知识...

将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境中

需求&#xff1a;关于如何将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境test2里&#xff0c;而且他们提到用requirements.txt 安装一直报错&#xff0c;所以想尝试直接拷贝的方法。 可以尝试通过直接拷贝移植的方式迁移Python环境到Anaconda虚拟环境&#xff0c;但…...

AI 数字短视频数字人源码开发:多维赋能短视频生态革新​

在短视频行业深度发展的进程中&#xff0c;AI 数字短视频数字人源码开发凭借其独特的技术优势&#xff0c;从多个维度为行业生态带来了革命性的变化&#xff0c;重塑短视频创作、传播与应用的格局。 数据驱动&#xff0c;实现内容精准化创作 AI 数字短视频数字人源码开发能够深…...

ffmpeg 硬解码相关知识

一&#xff1a;FFMPEG 支持的硬解方式&#xff1a;如下都是了解知识 DXVA2 - windows DXVA2 硬件加速技术解析‌ ‌一、核心特性与适用场景‌ ‌技术定义‌&#xff1a;DXVA2&#xff08;DirectX Video Acceleration 2&#xff09;是微软推出的基于 DirectX 的硬件加速标准…...