[C++面试] 你了解transform吗?
层级 | 核心知识点 |
---|---|
入门 | 基本语法、与for_each 对比、单/双范围操作 |
进阶 | 动态扩展、原地转换、类型兼容性、异常安全 |
高阶 | 性能优化、C++20 Ranges、transform_if 模拟 |
一、入门
1、描述std::transform
的基本功能,并写出两种版本的函数原型
std::transform
函数是 C++ 标准库<algorithm>
头文件中的一个算法,其主要用途是对一个或两个范围的元素进行变换,并将结果存储到另一个范围中。它有两种重载形式:一种用于单范围变换,另一种用于双范围变换。
一元版本:处理单个输入范围,函数原型:
template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op );
first1
和last1
:定义输入范围的迭代器,指定要变换的元素范围。d_first
:输出范围的起始迭代器,用于存储变换后的结果。unary_op
:一元操作符,用于对输入范围的每个元素进行变换。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> input = {1, 2, 3, 4, 5};std::vector<int> output(input.size());// 将一个整数向量中的每个元素乘以 2std::transform(input.begin(), input.end(), output.begin(), [](int x) {return x * 2;});return 0;
}
二元版本:处理两个输入范围,函数原型:
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op );
first1
和last1
:定义第一个输入范围的迭代器。first2
:第二个输入范围的起始迭代器,其长度应至少与第一个输入范围相同。d_first
:输出范围的起始迭代器,用于存储变换后的结果。binary_op
:二元操作符,用于对两个输入范围的对应元素进行变换。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> input1 = {1, 2, 3, 4, 5};std::vector<int> input2 = {5, 4, 3, 2, 1};std::vector<int> output(input1.size());std::transform(input1.begin(), input1.end(), input2.begin(), output.begin(), [](int x, int y) {return x + y;});return 0;
}
2、与for_each
的区别
-
std::for_each
:主要用于对一个范围内的每个元素执行某种操作,重点在于操作本身,通常这些操作会产生副作用,比如修改元素、打印日志等。该函数不返回经过操作后的数据,它的返回值类型是传入的可调用对象类型,且这个可调用对象的返回值类型通常为void
。 -
std::transform
:专注于对一个或多个范围内的元素进行转换,通过返回值生成一个新的序列。它可以将转换后的结果输出到不同的容器中,常用于无副作用的纯转换操作。
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
// first 和 last:定义输入范围的迭代器。
// f:一元可调用对象,对输入范围内的每个元素执行该操作。
#include <iostream>
#include <vector>
#include <algorithm>// 定义一个用于 for_each 的可调用对象,用于打印元素并将元素加 1
struct PrintAndIncrement {void operator()(int& num) {std::cout << "Original: " << num << std::endl;num += 1;std::cout << "After increment: " << num << std::endl;}
};// 定义一个用于 transform 的可调用对象,用于将元素乘以 2
int MultiplyByTwo(int num) {return num * 2;
}int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用 std::for_each 进行带副作用的操作std::for_each(numbers.begin(), numbers.end(), PrintAndIncrement());// 重置 numbers 向量numbers = {1, 2, 3, 4, 5};std::vector<int> result(numbers.size());// 使用 std::transform 进行纯转换操作std::transform(numbers.begin(), numbers.end(), result.begin(), MultiplyByTwo);return 0;
}
二、进阶
1、如何在不预分配目标容器空间时使用transform
?
在使用 std::transform
时,如果不提前为目标容器分配空间,直接使用普通的迭代器可能会导致未定义行为,因为迭代器可能会访问到容器外部的内存。
而使用 std::back_inserter
可以解决这个问题。std::back_inserter
是一个插入迭代器,它会在每次赋值操作时调用目标容器的 push_back
方法,这样就可以动态地向容器中添加元素,而不需要提前分配空间。
std::vector<int> results;
std::transform(src.begin(), src.end(), std::back_inserter(results), [](int x) { return x * 2; });
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>int main() {// 定义源容器std::vector<int> src = {1, 2, 3, 4, 5};// 定义目标容器,初始为空,不预分配空间std::vector<int> results;// 使用 std::transform 和 std::back_inserterstd::transform(src.begin(), src.end(), std::back_inserter(results), [](int x) {return x * 2;});return 0;
}
std::back_inserter(results)
作为输出迭代器,它会在每次赋值操作时调用results
容器的push_back
方法,将转换后的元素添加到results
容器中。
2、如何用transform
实现原地修改?可能存在哪些风险?
将目标迭代器设为输入范围的起始迭代器。
风险:若操作抛出异常,容器可能处于部分修改状态,也需确保操作不破坏元素依赖关系。
std::transform(vec.begin(), vec.end(), vec.begin(), ::toupper); // 字符串转大写
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>int main() {std::vector<std::string> vec = {"hello", "world", "cpp"};// 使用 std::transform 实现原地修改for (auto& str : vec) {std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) {return std::toupper(c);});}return 0;
}
3、ransform
是否支持输入与输出类型不同?举例说明
// 将std::string转换为哈希值:
std::vector<std::string> words {"one", "two"};
std::vector<size_t> hashes;
std::transform(words.begin(), words.end(), std::back_inserter(hashes), std::hash<std::string>{});
std::transform
是支持输入与输出类型不同的。它的设计初衷是对一个或多个范围的元素进行转换操作,最终将结果存储到另一个范围中。在这个过程中,转换操作可以将输入类型的数据转换为不同类型的输出数据,只要提供合适的转换函数即可。
三、高阶
1、如何通过自定义函数对象优化transform
性能?
- 使用无状态的函数对象(如
struct
重载operator()
),便于编译器内联优化 - 避免在
lambda
中捕获大型对象,减少拷贝开销。
- 无状态的函数对象是指不包含任何成员变量的函数对象。
- 编译器在处理无状态函数对象时,更容易进行内联优化。
- 内联优化是指编译器将函数调用替换为函数体本身,从而减少函数调用的开销。
#include <iostream>
#include <vector>
#include <algorithm>// 无状态的函数对象,用于计算平方
struct Square {int operator()(int x) const {return x * x;}
};int main() {std::vector<int> src = {1, 2, 3, 4, 5};std::vector<int> dest(src.size());// 使用自定义的无状态函数对象进行转换std::transform(src.begin(), src.end(), dest.begin(), Square{});return 0;
}
当使用 lambda 表达式作为转换操作时,如果捕获了大型对象,会产生拷贝开销。
#include <iostream>
#include <vector>
#include <algorithm>// 大型对象示例
struct LargeObject {int data[1000];
};int main() {std::vector<int> src = {1, 2, 3, 4, 5};std::vector<int> dest(src.size());// 避免捕获大型对象LargeObject largeObj;// 使用不捕获大型对象的 lambdastd::transform(src.begin(), src.end(), dest.begin(), [](int x) {return x * 2;});// 输出结果for (int num : dest) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
- 在
std::transform
调用中,使用的 lambda 表达式没有捕获LargeObject
类型的对象,避免了拷贝开销。如果确实需要使用大型对象,可以考虑使用引用捕获,如[&largeObj](int x) { /* 使用 largeObj */ }
,但要注意引用的生命周期问题。
2、C++20的ranges::transform
有何改进?
C++20引入范围语法,简化迭代器传递。支持更简洁的链式操作(如与views
组合)。
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> src = {1, 2, 3, 4, 5};std::vector<int> dest(src.size());std::ranges::transform(src, dest.begin(), [](int x) {return x * 2;});return 0;
}
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> src = {1, 2, 3, 4, 5};// 链式操作:先过滤出偶数,再将其乘以 2auto result = src | std::views::filter([](int x) { return x % 2 == 0; })| std::views::transform([](int x) { return x * 2; });return 0;
}
std::views::filter
是一个视图适配器,用于过滤出满足条件的元素。std::views::transform
是另一个视图适配器,用于对元素进行转换。- 通过使用管道操作符
|
,可以将多个视图适配器组合在一起,形成一个链式操作。整个操作是惰性计算的,只有在遍历result
范围时才会实际执行过滤和转换操作,避免了创建中间容器,提高了性能和代码的简洁性。
3、STL未提供transform_if
,如何模拟其功能?
法1:先转换再过滤
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>int main() {std::vector<int> src = { -1, 2, -3, 4, -5 };std::vector<int> filtered;// 先进行转换:使用 std::transform 对 src 中的每个元素进行转换。如果元素大于 0,则将其乘以 2;否则,将其设置为 -1。std::transform(src.begin(), src.end(), std::back_inserter(filtered), [](int x) { return x > 0 ? x * 2 : -1; });// 过滤掉不符合条件的元素:使用 std::remove 和 erase 组合来移除值为 -1 的元素// std::remove 将值为 -1 的元素移到容器末尾,并返回一个指向新的逻辑末尾的迭代器,然后 erase 函数删除这些元素。filtered.erase(std::remove(filtered.begin(), filtered.end(), -1), filtered.end());return 0;
}
法2:结合std::copy_if
与transform
int main() {std::vector<int> src = { -1, 2, -3, 4, -5 };std::vector<int> temp;std::vector<int> result;// 过滤出符合条件的元素std::copy_if(src.begin(), src.end(), std::back_inserter(temp), [](int x) { return x > 0; });// 对符合条件的元素进行转换std::transform(temp.begin(), temp.end(), std::back_inserter(result), [](int x) { return x * 2; });return 0;
}
- 过滤操作:使用
std::copy_if
将src
中大于 0 的元素复制到temp
容器中。 - 转换操作:使用
std::transform
对temp
中的元素进行转换,将每个元素乘以 2
法3:使用std::accumulate
手动处理条件
#include <iostream>
#include <vector>
#include <numeric>int main() {std::vector<int> src = { -1, 2, -3, 4, -5 };std::vector<int> result;// 使用 std::accumulate 手动处理std::accumulate(src.begin(), src.end(), std::back_inserter(result), [](auto& out, int x) {if (x > 0) {out = x * 2;++out;}return out;});// 输出结果for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
std::accumulate
会遍历 src
中的每个元素,根据条件判断是否进行转换。如果元素大于 0,则将其乘以 2 并添加到 result
容器中。
4、 在使用std::transform
时,如何处理可能出现的异常?请给出一个考虑异常安全性的示例
在使用std::transform
时,异常可能来自于传入的操作符(如 lambda 函数、函数对象等)。
为了处理可能出现的异常,我们可以在操作符内部进行异常处理,或者在调用std::transform
的地方进行异常捕获。
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdexcept>std::string convert_string(const std::string& str) {// convert_string函数用于将输入字符串转换为大写,如果输入字符串为空,则抛出std::invalid_argument异常if (str.empty()) {throw std::invalid_argument("Input string is empty");}std::string result = str;for (char& c : result) {c = std::toupper(c);}return result;
}int main() {std::vector<std::string> input = {"hello", "", "world"};std::vector<std::string> output(input.size());try {std::transform(input.begin(), input.end(), output.begin(), convert_string);for (const std::string& str : output) {std::cout << str << " ";}std::cout << std::endl;} catch (const std::exception& e) {std::cerr << "Exception caught: " << e.what() << std::endl;}return 0;
}
相关文章:
[C++面试] 你了解transform吗?
层级核心知识点入门基本语法、与for_each对比、单/双范围操作进阶动态扩展、原地转换、类型兼容性、异常安全高阶性能优化、C20 Ranges、transform_if模拟 一、入门 1、描述std::transform的基本功能,并写出两种版本的函数原型 std::transform函数是 C 标准库<…...
MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。 前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比…...
docker 安装部署 canal
1 mysql 安装 1.1 拉取镜像 docker pull mysql:8.4.41.2 创建挂载目录 mkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/confmkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/datamkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/log1.3 编辑配置文…...
flowable适配达梦7 (2.1)
经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…...
优化 Docker 镜像 技巧
优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法: 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
Linux笔记之Ubuntu22.04安装IBus中文输入法教程
Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review! 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …...
(UI自动化测试web端)第二篇:元素定位的方法_xpath属性定位
看代码里的【driver.find_element_by_xpath( )】()里的路径怎么写? xpath元素定位有多种写法,那我们现在说的就是在元素定位时,根据网页的实际情况来选择适合的xpath元素定位的写法。 文章主要介绍了xpath属性定位的方法和属性扩展使用的方法…...
Linux中执行 ifconfig 命令时提示 “未找到命令”
在 Linux 系统里,若执行 ifconfig 命令时提示 “未找到命令” 通常是由于系统没有安装 net-tools 包,或者该命令不在系统的 PATH 环境变量所包含的路径中 安装 net-tools 包 # Ubuntu/Debian sudo apt update sudo apt install net-tools# CentOS 7 及以…...
UE4学习笔记 FPS游戏制作15修正可以换枪中可以继续换枪和开火的Bug
现在存在的问题是换枪动作没完成时,可以继续换枪或者开枪 因为换枪这个动作是由玩家进行的,所以应该修改FppShooter脚本 我们添加两个参数 最后一次换枪的时间和换枪动画的长度 EquipmentLength 设置默认值0.6秒 添加一个新函数IsInEquip,返…...
SSL/TLS 和 SSH 介绍以及他们的区别
目录 SSL/TLS SSL/TLS工作原理的核心步骤握手阶段(Handshake Protocol)加密通信阶段(Encrypted Communication Phase)会话恢复(Session Resumption) SSH SSH 加密机制的核心步骤 SSH 和 SSL 区别 SSL/TLS …...
AudioTrack
AudioTrack是Android Audio系统提供给应用开发者(java/C)的API,用于操作音频播放的数据通路。MeidaPlayer在播放音乐时用到的是它,我们可以也可以直接使用AudioTrack进行音频播放。它是最基本的音频数据输出类。 AudioTrack.java…...
Windows安装Rust环境(详细教程)
一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio,但该工具占用空间大安装也较为麻烦,可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub:Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…...
监控IP,网站将异常情况通过飞书机器人发至指定群内
界面如下,丑是丑了点,但主打一个实用。 主要就是通过ping,就是一直在ping,当不通的时候,就根据你设置的报警时间,主要是利用飞书机器人来给飞书指定群里发异常信息报警。 直接上代码 import subprocess i…...
JVM 02
今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...
局域网设备访问虚拟机 挂载NFS
目录 引言:网络IP问题配置虚拟机网络有线网络:无线网络: NFS文件挂载服务端配置客户端连接 引言: 需求:局域网下树莓派设备想要访问电脑主机上的虚拟机。这样可以通过nfs挂载网络设备,有利于交叉编译环境调…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器
使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤,涵盖多种常见方法: 方法一:通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装: Java 运行环境(与项目 JDK 版本一致࿰…...
利用dify打造命令行助手
利用dify打造命令行助手 前言 我是mac os 的使用者。 如果说macos哪个工具我使用最频繁,最能提高效率的工作工具非zsh莫属(当然,我安装了iterm)。前不久,我要扩容线上的k8s集群。便想统计一下每个node上运行的pod数量。我不知道合适的命令&…...
前端面试整理
一、csshtml 二、js 三、vue 四、react 1.React 类组件与函数式组件核心区别 定义方式的不同,类组件用ES6的class,继承React.Component,而函数式组件用函数声明。 状态管理方面,类组件用this.state和setState,函…...
Perl语言的计算机网络
Perl语言在计算机网络中的应用 引言 在计算机科学的众多领域中,网络编程是一个极具挑战性和广泛应用的领域。在这其中,Perl语言以其强大的文本处理能力和简洁的语法,成为了网络编程的重要工具之一。自从1987年Larry Wall创造Perl以来&#…...
数据结构初阶-二叉树的应用
1.单值二叉树 题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最…...
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Doc…...
掌握C#循环:for、while、break与continue详解及游戏案例
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
【算法笔记】图论基础(二):最短路、判环、二分图
目录 最短路松弛操作Dijkstra朴素Dijkstra时间复杂度算法过程例题 堆优化Dijkstra时间按复杂度算法过程例题 bellman-ford时间复杂度为什么dijkstra不能处理负权边?dijkstra的三个步骤:反例失效的原因 算法过程例题 spfa时间复杂度算法过程例题spfa求最短…...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题...
基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【背景介绍】 中空圆柱形缺陷检测在多个领域具有深远意义。在石油、天然气及化工行业,缺陷检测可预防泄漏事故,避免火灾、爆炸及环境污染,保障人员与财产安全。建筑、桥梁及航空航天领域则依赖此技术确保中空圆柱形结构的稳定性,…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】
./buildroot/system/skeleton/etc/profile # some more ls aliases alias llls -alF alias lals -A alias lls -CF 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】 2025/3/21 16:53 cd /etc/ echo "" >> # some more ls ali…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
如何在 Java 中查找 PDF 页面大小(教程)
PDF 文件并未被 Java 直接支持。本教程将向您展示如何使用 JPedal Java PDF 库 以简单的步骤提取 PDF 文件的页面大小(高度和宽度)。页面大小可以以 厘米、英寸或像素 为单位获取。 为什么要使用第三方库处理 PDF 文件? PDF 文件是一种复杂…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
使用Mastra.ai构建AI智能体:一次动手实践
Mastra框架提供了一种简洁高效的AI智能体构建方式。 本文将分享我使用Mastra.ai的实践经历。 我们将逐步完成环境搭建、探索框架核心功能,并构建一个能与工具交互的基础智能体。 过程中我会总结成功经验、遇到的问题以及收获的启示。 如果你对AI开发感兴趣,或正在寻找一个…...
Redis之大key问题
BigKey 常见面试题目 你会么? MoreKey 案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行,批量插入100W for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;生成100W条redis批量设置kv的…...
Excel第41套全国人口普查
2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...
深度学习驱动的车牌识别:技术演进与未来挑战
一、引言 1.1 研究背景 在当今社会,智能交通系统的发展日益重要,而车牌识别作为其关键组成部分,发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中,它可以用于车辆识别、交通违…...
PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一
PageHiOffice网页组件作为最新一代的WebOffice文档控件,这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件,是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年,不管是功能性还是稳定性都已经有了长…...
A2 最佳学习方法
记录自己想法的最好理由是发现自己的想法,并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈: 做培训或者写文章ÿ…...
从JVM底层揭开Java方法重载与重写的面纱:原理、区别与高频面试题突破
🌟引言:一场由方法调用引发的"血案" 2018年,某电商平台在"双十一"大促期间遭遇严重系统故障。 技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级…...
线程控制与线程操作
目录 线程的创建 tid pthread_self() 线程的退出 pthread_join 传参问题和返回值问题 pthread_exit 线程取消 线程分离 我们来学习线程的控制与线程操作 线程的创建 我们之前在线程的概念中就讲过了,我们可以通过pthread_create来创建一个或者多个子线程…...
Spring相关API
1是相对路径 2 是绝对路径 3 在注解时使用...
【GoLang】调用llm时提示词prompt的介绍以及使用方式
介绍 提示词是一种与大模型交互的对话格式,它以 JSON 格式定义了一个消息列表(messages),包含了系统消息和用户消息。 我们向AI提问时,其实发给AI的都是提示词,别看我们只是简单输入了一句话,…...
[杂学笔记]锁为什么影响效率、I/O多路复用、三种I/O多路复用模型的区别、atomic原子操作类、MySQL的持久性是如何实现的
目录 1.锁为什么影响效率 2.I./O多路复用 3.三种I/O多路复用模型的区别 4.atomic原子操作类 介绍 常用函数 内存顺序含义 5.MySQL持久性的实现 1.锁为什么影响效率 线程阻塞与上下文切换:在多线程并发访问的场景下,只有一个线程能够进入临界区…...
AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...
Leetcode 刷题笔记 图论part05
卡码网 107 寻找存在的路径 初识并查集 并查集功能: 寻找根节点,函数: find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数: join(int u, int v),将两个节点连在同一个根节点上判断两…...
NSSRound(持续更新)
了解过PHP特性吗 这个题相当于是php特性大杂烩 先看源代码 <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match(&qu…...
Python虚拟环境:从入门到实战指南
目录 一、为什么需要Python虚拟环境? 二、如何创建Python虚拟环境? 1. 使用venv(Python 3.3内置) 2. 使用virtualenv(第三方工具) 3. 使用conda(适合数据科学项目) 三、虚拟环…...