C++ STL vector高级特性与实战技巧
引言
各位小伙伴们好!上一篇博客我们介绍了vector的基础知识和常见操作,今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。
想象一下vector就像一辆能自动变长的公交车,我们上一篇讲了如何上下车(添加删除元素)、如何找座位(访问元素)。今天我们要探讨这辆公交车的引擎是如何工作的(内存管理),以及一些高级驾驶技巧(优化策略)。系好安全带,我们开始吧!
一、vector的内存管理详解
内存布局与分配策略
vector在内存中是一块连续的区域,它保存了三个关键指针:
- start:指向数据的起始位置
- finish:指向最后一个元素的后一个位置
- end_of_storage:指向分配内存的末尾
这就像一个教室:已经坐了n个学生,还有一些空座位。
扩容机制详解
当vector需要更多空间时(如push_back到已满的vector),会发生以下步骤:
- 分配新内存(通常是当前容量的1.5倍或2倍,取决于STL实现)
- 将原有元素移动/复制到新内存
- 销毁原内存中的对象
- 释放原内存
- 更新内部指针(start, finish, end_of_storage)
在不同的STL实现中,扩容倍数可能不同:
- GCC通常采用2倍扩容
- Microsoft Visual C++通常采用1.5倍扩容
我们可以通过一个简单的程序观察扩容行为:
#include <iostream>#include <vector>int main() {std::vector<int> vec;size_t lastCap = 0;for(int i = 0; i < 64; ++i) {vec.push_back(i);if(vec.capacity() != lastCap) {std::cout << "New capacity: " << vec.capacity() << " (grew by " << (lastCap == 0 ? "-" : std::to_string(static_cast<double>(vec.capacity()) / lastCap)) << ")" << std::endl;lastCap = vec.capacity();}}return 0;}
这就像学校不断需要更大的教室,每次搬家都是一个费力的过程。这也是为什么我们要尽量避免频繁扩容。
内存释放时机
以下操作会导致vector释放内存:
- clear():移除所有元素,但不会改变capacity
- shrink_to_fit():将capacity减少到和size一样
- swap():与一个更小的vector交换后,可能会释放内存
- 析构函数:vector销毁时释放所有内存
std::vector<int> vec(1000, 0);vec.clear(); // 元素被销毁,但内存仍然被保留std::cout << "After clear: " << vec.capacity() << std::endl;vec.shrink_to_fit(); // 释放多余内存std::cout << "After shrink_to_fit: " << vec.capacity() << std::endl;std::vector<int>().swap(vec); // 另一种释放内存的技巧(C++11前)
二、vector与其他容器的比较
理解vector与其他容器的区别,有助于我们在不同场景下选择最适合的工具。
vector vs. array
特点 | vector | array |
---|---|---|
大小 | 动态 | 固定 |
内存管理 | 自动 | 手动 |
性能开销 | 有扩容开销 | 无额外开销 |
功能 | 丰富的成员函数 | 有限 |
适用场景:
- 当元素数量不确定或可变时,选择vector
- 当元素数量固定且已知时,可以考虑array
vector vs. list
特点 | vector | list |
---|---|---|
内存布局 | 连续存储 | 链表结构 |
随机访问 | O(1) | O(n) |
插入/删除(中间) | O(n) | O(1) |
插入/删除(末尾) | 均摊 O(1) | O(1) |
内存开销 | 较低 | 每个元素有额外指针开销 |
适用场景:
- 频繁随机访问,选择vector
- 频繁在中间插入删除,选择list
vector vs. deque
特点 | vector | deque |
---|---|---|
内存布局 | 单一连续块 | 多个连续块 |
随机访问 | O(1) | O(1),但略慢 |
头部插入/删除 | O(n) | O(1) |
尾部插入/删除 | 均摊 O(1) | O(1) |
迭代器复杂性 | 简单 | 较复杂 |
适用场景:
- 需要高效的头尾操作,选择deque
- 需要最高效的随机访问,选择vector
三、vector的高级操作与技巧
1. 高效的内存预分配
避免频繁扩容是优化vector性能的关键:
// 低效方式std::vector<int> vec;for(int i = 0; i < 10000; i++) {vec.push_back(i); // 可能导致多次扩容}// 高效方式1:预分配std::vector<int> vec2;vec2.reserve(10000);for(int i = 0; i < 10000; i++) {vec2.push_back(i); // 不会扩容}// 高效方式2:直接指定大小std::vector<int> vec3(10000);for(int i = 0; i < 10000; i++) {vec3[i] = i; // 更高效,无需push_back}
这就像提前租一个足够大的教室,避免学生来了才发现教室太小,需要搬家。
2. 使用emplace_back代替push_back
C++11引入的emplace_back可以在容器内直接构造对象,避免不必要的临时对象创建和复制:
struct Person {std::string name;int age;Person(std::string n, int a) : name(std::move(n)), age(a) {std::cout << "构造函数被调用" << std::endl;}Person(const Person& other) : name(other.name), age(other.age) {std::cout << "拷贝构造函数被调用" << std::endl;}};// 使用push_backstd::vector<Person> people;people.push_back(Person("张三", 25)); // 构造+拷贝// 使用emplace_backstd::vector<Person> people2;people2.emplace_back("张三", 25); // 只有构造,无拷贝
这就像直接在教室里安排新学生,而不是先在走廊安排好再搬进教室。
3. 自定义分配器
对于特殊的内存管理需求,可以为vector提供自定义的分配器:
template <typename T>class PoolAllocator {public:typedef T value_type;// ... 分配器实现 ...T* allocate(size_t n) {// 从内存池分配n个T对象的空间}void deallocate(T* p, size_t n) {// 返回内存到池}};// 使用自定义分配器的vectorstd::vector<int, PoolAllocator<int>> vec;
这就像学校有了专属的资源管理员,按照特殊规则分配教室。
4. 高效的vector元素删除技巧
删除vector中的特定元素有多种方法,性能各不相同:
// 删除指定值的所有元素// 1. 使用erase-remove习惯用法(推荐)vec.erase(std::remove(vec.begin(), vec.end(), 5), vec.end());// 2. 使用erase和迭代器(删除时注意迭代器失效)for(auto it = vec.begin(); it != vec.end(); ) {if(*it == 5) {it = vec.erase(it); // erase返回下一个有效迭代器} else {++it;}}// 3. 保持元素顺序的高效删除多个元素auto isTargetValue = [](int x) { return x == 5; };int writeIndex = 0;for(int readIndex = 0; readIndex < vec.size(); ++readIndex) {if(!isTargetValue(vec[readIndex])) {if(writeIndex != readIndex) {vec[writeIndex] = vec[readIndex];}++writeIndex;}}vec.resize(writeIndex); // 截断vector
这就像在教室里重新安排座位,把某些同学"删除"掉。
四、vector在实际项目中的应用
1. 图像处理
// 使用vector存储图像数据struct Pixel {uint8_t r, g, b, a;};class Image {private:int width, height;std::vector<Pixel> pixels;public:Image(int w, int h) : width(w), height(h), pixels(w * h) {}Pixel& at(int x, int y) {return pixels[y * width + x];}void applyFilter(const std::function<void(Pixel&)>& filter) {for(auto& pixel : pixels) {filter(pixel);}}};// 使用示例Image img(800, 600);img.applyFilter([](Pixel& p) {// 应用灰度滤镜uint8_t gray = (p.r + p.g + p.b) / 3;p.r = p.g = p.b = gray;});
2. 游戏开发中的对象管理
class GameObject {public:virtual void update(float deltaTime) = 0;virtual void render() = 0;virtual ~GameObject() {}};class Player : public GameObject {// 玩家实现...};class Enemy : public GameObject {// 敌人实现...};class GameWorld {private:std::vector<std::unique_ptr<GameObject>> objects;public:template<typename T, typename... Args>T* createObject(Args&&... args) {auto obj = std::make_unique<T>(std::forward<Args>(args)...);T* ptr = obj.get();objects.push_back(std::move(obj));return ptr;}void update(float deltaTime) {for(auto& obj : objects) {obj->update(deltaTime);}}void render() {for(auto& obj : objects) {obj->render();}}void removeDeadObjects() {objects.erase(std::remove_if(objects.begin(), objects.end(),[](const std::unique_ptr<GameObject>& obj) {// 检查对象是否应该被移除return false; // 示例条件}),objects.end());}};
3. 高效的字符串处理
// 分割字符串std::vector<std::string> split(const std::string& str, char delimiter) {std::vector<std::string> result;std::stringstream ss(str);std::string item;while(std::getline(ss, item, delimiter)) {if(!item.empty()) {result.push_back(item);}}return result;}// 连接字符串(高效版)std::string join(const std::vector<std::string>& strings, const std::string& delimiter) {if(strings.empty()) {return "";}// 预计算总长度,避免多次内存分配size_t totalLength = 0;for(const auto& s : strings) {totalLength += s.length();}totalLength += delimiter.length() * (strings.size() - 1);// 一次性分配内存std::string result;result.reserve(totalLength);// 连接字符串result = strings[0];for(size_t i = 1; i < strings.size(); ++i) {result += delimiter;result += strings[i];}return result;}
五、vector常见面试题解析
1. vector的底层实现是什么?
vector是一个动态数组,底层维护一段连续的内存空间。它通过三个指针管理这段空间:指向数据起始位置的指针,指向最后一个元素后一个位置的指针,以及指向分配内存末尾的指针。当需要更多空间时,vector会分配一块更大的内存,复制现有元素,再释放原内存。
2. vector的push_back时间复杂度是多少?
- 最好情况:O(1),当有足够的预留空间时
- 最坏情况:O(n),当需要扩容并复制所有元素时
- 平均/均摊复杂度:O(1),使用均摊分析法分析
3. 如何避免vector扩容时的性能损失?
- 使用reserve预分配足够空间
- 使用resize预先设置大小
- 初始化时直接指定容量或大小
- 慎用频繁的push_back和insert操作
- 必要时考虑使用其他容器如deque
4. 什么情况下vector的迭代器会失效?
- 当扩容发生时(如push_back导致扩容)
- 当在迭代器前面插入元素时
- 当删除元素时,指向被删除元素及其后面的迭代器都会失效
5. vector与list相比,优缺点是什么?
vector优点:
- 内存连续,cache友好,访问速度快
- 随机访问效率高O(1)
- 尾部添加删除元素效率高(均摊O(1))
- 内存开销小
vector缺点:
- 中间插入删除操作慢O(n)
- 扩容时需要复制所有元素
- 可能导致迭代器失效
相比之下,list是双向链表,中间插入删除为O(1),但随机访问为O(n),且每个节点有额外的指针开销。
总结与实践建议
通过这两篇博客,我们全面探讨了C++ STL vector容器的原理与高级应用。在实际开发中,我推荐以下几点实践建议:
1. 选择合适的容器
- 需要随机访问并频繁在尾部操作元素:选择vector
- 需要频繁在任意位置插入删除:考虑list或deque
- 元素数量固定且已知:考虑array
- 需要频繁在两端操作:考虑deque
2. 优化vector使用
- 提前预分配:使用reserve避免频繁扩容
- 避免不必要的拷贝:使用引用传参、移动语义、emplace_back等
- 谨慎操作迭代器:了解哪些操作会导致迭代器失效
- 批量操作:尽可能批量处理元素,减少单元素操作
- 合理管理内存:必要时使用shrink_to_fit释放多余内存
3. 利用STL算法
结合STL算法可以发挥vector的最大威力:
std::sort(vec.begin(), vec.end());// 查找auto it = std::find(vec.begin(), vec.end(), value);// 删除特定值vec.erase(std::remove(vec.begin(), vec.end(), value), vec.end());// 去重std::sort(vec.begin(), vec.end());vec.erase(std::unique(vec.begin(), vec.end()), vec.end());// 计算总和// 排序int sum = std::accumulate(vec.begin(), vec.end(), 0);
4. 性能监控与调优
在性能关键的应用中,考虑对vector使用进行监控和调优:
- 观察扩容频率和内存使用模式
- 测量主要操作的时间消耗
- 考虑自定义分配器提高特定场景下的性能
- 使用性能分析工具找出瓶颈
结语
vector作为C++ STL中最常用的容器,它融合了数组的高效随机访问和动态内存管理的灵活性。熟练掌握vector的工作原理和使用技巧,不仅能帮助你写出更高效的代码,也有助于理解内存管理、迭代器设计等核心C++概念。
记住:编程工具就像厨房里的刀具,了解每种工具的特性和适用场景,选择最合适的工具,才能事半功倍。vector作为C++中的"瑞士军刀",值得你深入学习与掌握!
我希望这两篇博客能够帮助你更好地理解和使用vector。如果有任何问题或需要进一步讨论特定的vector应用场景,欢迎在评论区留言交流!
相关文章:
C++ STL vector高级特性与实战技巧
引言 各位小伙伴们好!上一篇博客我们介绍了vector的基础知识和常见操作,今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车,我们上一篇讲了如何上下车(添加删…...
[Windows] Kazumi番剧采集v1.6.9:支持自定义规则+在线观看+弹幕,跨平台下载
[Windows] Kazumi番剧采集 链接:https://pan.xunlei.com/s/VOPLMhEQD7qixvAnoy73NUK9A1?pwdtu6i# Kazumi是一款基于框架; 开发的轻量级番剧采集工具,专为ACG爱好者设计。通过;自定义XPath规则; 实现精准内容抓取,支持多平台(An…...
二种MVCC对比分析
文章目录 前言MVCCInnodb的MVCC版本链回滚与提交可见性判断 Oracle的MVCC版本链 PostgreSQL的MVCCMVCC实现可见性判断特点 前言 MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种数据库管理系统(DBMS&#x…...
Python蓝桥杯真题代码
以下是一些不同届蓝桥杯Python真题代码示例: 第十四届青少年蓝桥杯python组省赛真题 删除字符串后缀 input_str input("请输入一个字符串:") suffixes (er, ly, ing) for suffix in suffixes: if input_str.endswith(suffix): input_str …...
高中数学联赛模拟试题精选学数学系列第5套几何题
四边形 A B C D ABCD ABCD 的对角线 A C AC AC 与 B D BD BD 互相垂直, 点 M M M, N N N 在直线 B D BD BD 上, 且关于直线 A C AC AC 对称. 设点 M M M 关于直线 A B AB AB, B C BC BC 的对称点分别为 X X X, Y Y Y, 点 N N N 关于直线 C D CD CD, D A DA DA 的…...
【KWDB 创作者计划】Docker单机环境下KWDB集群快速搭建指南
【KWDB 创作者计划】Docker 单机环境下 KaiwuDB集群快速搭建指南 前言一、KWDB介绍1.1 KWDB简介1.2 主要特点1.3 典型应用场景 二、环境介绍2.1 部署环境要求2.2 本地环境规划2.3 本次部署介绍 三、下载容器镜像四、创建相关证书文件4.1 创建部署目录4.2 创建证书文件4.3 查看证…...
基于51单片机和LCD1602、矩阵按键的小游戏《猜数字》
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、LCD16022、矩阵按键3、定时器0 四、主函数总结 系列文章目录 前言 用的是普中A2开发板,用到板上的矩阵按键,还需要外接一个LCD1602液晶显示屏。 【单片机】STC89C52RC 【频率】12T11.05…...
从广义线性回归推导出Softmax:理解多分类问题的核心
文章目录 引言:从回归到分类广义线性模型回顾从二分类到多分类Softmax函数的推导建模多类概率基于最大熵原理具体推导步骤Softmax函数的数学形式 Softmax回归模型参数的可辨识性 最大似然估计与交叉熵损失似然函数交叉熵损失梯度计算 Softmax回归的实现要点数值稳定…...
传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本
【早期经典版本】 1.10 三英雄传说:2001 年 9 月 28 日热血传奇正式开启公测,这是传奇的第一个版本。游戏中白天与黑夜和现实同步,升级慢,怪物爆率低,玩家需要靠捡垃圾卖金币维持游戏开销,遇到高级别法师…...
云计算-私有云-私有云运维开发
三、私有云运维开发(15) 使用自动化运维工具 Ansible 完成系统的自动化部署与管理。 基于 OpenStack APIs 与SDK,开发私有云运维程序 1.OpenStack Python运维开发:实现镜像管理(7分) 编写Python代…...
hadoop存储数据文件原理
Hadoop是一个开源的分布式计算框架,可以用于存储和处理大规模数据集。Hadoop的存储系统基于Hadoop Distributed File System(HDFS),它的主要原理如下: 数据切块:当用户向HDFS中存储一个文件时,该…...
spring2.x详解介绍
一、核心架构升级 Spring 2.x 是 Spring 框架的重要迭代版本(2006-2009年间发布),其核心改进体现在 模块化设计 和 轻量化配置 上。相较于 1.x 版本,2.x 通过以下方式重构了架构: XML Schema 支持:弃用 D…...
探索Grok-3的高级用法:功能与应用详解
引言 随着人工智能技术的迅猛发展,xAI推出的Grok-3模型以其卓越的性能和创新功能,成为AI领域的新标杆。Grok-3不仅在计算能力上实现了十倍提升,还引入了多种高级模式和实时数据处理能力,适用于学术研究、技术分析、市场洞察等多场…...
PyTorch_张量转换为numpy数组
使用 tensor.numpy 函数可以将张量转换为 ndarray 数组,但是共享内存,可以使用 copy 函数避免共享。共享内存会导致张量或者numpy中的其中一个更改后,另外一个会受到影响。 代码 import torch # 张量转换为 numpy 数组 def test01():data_te…...
什么是“原子变量”?
原子变量(std::atomic)在C++中是一个非常关键的机制,特别是在多线程编程中保持数据安全和避免竞争条件。它的设计目标就是让一段操作在多线程环境下变得“原子性”,即不可被中断,保证操作的完整与一致。 一、什么是“原子变量”? 简单来说: 普通变量:在多线程环境中,…...
[Linux开发工具]gcc/g++
C语言文件编译运行 gcc code.c -o mycode gcc -o mycode code.c 预处理 汇编 编译 链接 预处理(进行宏替换/去注释/条件编译/头文件展开) gcc -E code.c -o code.i -E ->从现在开始进行程序的编译,当我们 的程序预处理完毕后,翻译工作,就停下来 code.i预处理之后的结果 …...
【Mytais系列】Type模块:类型转换
MyBatis 的 类型系统(Type System) 是框架处理 Java 类型与数据库类型之间映射的核心模块,它通过 类型处理器(TypeHandler)、类型别名(TypeAlias) 和 类型转换器 等机制,实现了数据库…...
C++类_虚基类
在 C 里,虚基类是用来解决菱形继承问题的。菱形继承问题是指当一个派生类从两个或更多基类派生,而这些基类又从同一个基类派生时,派生类会包含多份间接基类的数据副本,这可能会引发数据冗余和二义性问题。虚基类可以保证在派生类中…...
【自然语言处理与大模型】使用Xtuner进行模型合并与导出
在上一篇文章中我为大家介绍了Xtuner框架如何进行QLoRA微调,这个框架在微调过后会得到适配器权重文件,它的后缀是.pth。但原模型都是huggingface模型,其后缀是safetensors。所以呢我们在使用这个框架导出模型之前要合并,合并之前要…...
数据结构4.0
大家好,今天是栈的知识点~ 目录 一、栈的概念 1.0 栈的概念 2.0 概念区分 二、栈的方法 1.0 MyStack方法: 2.0 将元素压入栈顶 3.0 移除并返回栈顶元素 4.0 返回栈顶元素但不移除 三、栈的题目 1.0括号匹配 2.0逆波兰表达式求值 3.0 出栈…...
SMT贴片检验标准核心要点与实施规范
内容概要 SMT贴片检验标准是确保电子产品组装质量的核心框架,其核心要点覆盖从原材料到成品的全流程工艺控制。该标准体系以焊点质量、元件定位精度及锡膏印刷检测为技术基线,结合IPC-A-610电子组装验收规范,对PCBA加工中的缺陷类型、判定阈…...
探索 C++23 std::to_underlying:枚举底层值获取的利器
文章目录 引言基本概念作用使用示例与之前方法的对比在 C23 中的意义总结 引言 在 C 的发展历程中,每一个新版本都带来了许多令人期待的新特性和改进,以提升代码的安全性、可读性和可维护性。C23 作为其中的一个重要版本,也不例外。其中&…...
PyTorch学习之张量(Tensor)(一)
1. 张量的基本概念 1.1. 定义与特性 张量是PyTorch中最基础的数据结构,可视为多维数组的泛化形式,支持标量(0维)、向量(1维)、矩阵(2维)及更高维度的数据存储。其核心特性包括&…...
理解数学概念——支集(支持)(support)
1. 支集(support)的定义 在数学中,一个实函数 f 的支集(support)是函数的不被映射到 0 的元素域(即定义域)的子集。若 f 的(定义)域(domain)是一个拓扑空间(即符合拓扑的集合),则 f 的支集则定义为包含( f 的元素域中)不被映射到0的所有点之最小闭集…...
Python 部分内置函数及其用法详解
在 Python 编程的世界里,内置函数是我们强大的 “工具箱”,它们提供了丰富而便捷的功能,帮助我们高效地完成各种任务。本文将带你深入了解这些常用内置函数及其用法,通过简单易懂的实例,让你轻松掌握它们。 一、数据类…...
[蓝桥杯真题题目及解析]2025年C++b组
移动距离(填空)** 小明初始在二维平面的原点,他想前往坐标 (233,666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动,即沿着 x 轴正方…...
yolov5 train笔记4 roboflow
How to Train a YOLOv5 Model On a Custom Dataset Sign in to Roboflow https://www.youtube.com/watch?vr3Ke7ZEh2Qo 他的ai懂中文的 还是得训练,明天再搞 https://www.youtube.com/watch?vEmYCpbFQ5wo&t2s 很香但是我没有马内...
工作记录 2015-06-01
工作记录 2015-06-01 序号 工作 相关人员 1 修改了FnetFax 修改了iConverter 修改了iCDA 郝 FNSR识别引擎 统计了最近几个星期0223医院的打字和录音的时间比。上周的比值是3.42,是近8个星期中最低的值。和05/03/2015 - 05/09/2015的3.74相比,下降…...
创意Python爱心代码分享
在代码的世界里,程序员以独特方式书写浪漫。他们精心打造的一个个 demo,宛如熠熠星辰。这些 demo 不仅是技术结晶,更饱含对编程的热爱与执着。从简洁的算法示例到复杂的系统雏形,每一行代码都凝聚着思考与智慧。它们被无私分享&am…...
【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means
一、向量化表示的核心概念 1.1 特征空间与向量表示 多维特征表示:通过多个特征维度(如体型、毛发长度、鼻子长短等)描述对象,每个对象对应高维空间中的一个坐标点,来表示狗这个对象,这样可以区分出不同种…...
降维大合集
1. 主成分分析(PCA,Principal Component Analysis) 基本原理 PCA 是一种线性降维方法,其核心思想是: 找到数据中方差最大的方向(称为主成分),并将数据投影到这些方向上。 利用正交变…...
AWS上构建基于自然语言和LINDO API的线性规划与非线性规划的优化计算系统
我想要实现一个通过使用C#、Semantic Kernel库、OpenAI GPT 4的API和附件文档里提到的LINDO API 15.0实现通过中文自然语言提示词中包含LATEX代码输入到系统,通过LINDO API 15.0线性规划与非线性规划的优化计算程序输出计算结果和必要步骤的应用,结果用中…...
26考研 | 王道 | 计算机网络 | 第三章 数据链路层
26考研 | 王道 | 第三章 数据链路层 数据链路层所处的地位 数据链路层 使用 物理层 提供的“比特传输”服务数据链路层 为 网络层 提供服务,将网络层的 IP数据报(分组)封装成帧,传输给下一个相邻结点物理链路:传输介质…...
学习黑客资产威胁分析贴
第一天作业: 完成作业奖励: 🎁 奖励 1 ── Week 2《Web 渗透手册》预览 Day主题关键目标练手靶场 / 工具1HTTP 基础 & Burp 入门抓包、改包、重放PortSwigger Academy:“HTTP basics”2SQL 注入原理手工注入 sqlmapDVWA →…...
CSS元素动画篇:基于当前位置的变换动画(合集篇)
CSS元素动画篇:基于当前位置的变换动画(合集篇) 前言位移效果类元素动画水平抖动效果效果预览代码实现 垂直抖动效果效果预览代码实现 摇头动画效果效果预览代码实现 点头动画效果效果预览代码实现 旋转效果类元素动画摇摆动画效果效果预览代…...
Spring 容器相关的核心注解
以下是 Spring 容器中用于 Bean 管理、依赖注入、配置控制 的关键注解,按功能分类说明: 1. Bean 声明与注册 注解作用示例Component通用注解,标记一个类为 Spring Bean(自动扫描注册) Compo…...
经典算法 最小生成树(prim算法)
最小生成树 题目描述 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和。如果最小生成树不存在,则输出 impossible。 给定一张边带权的无向图 G (V, E),其中:…...
机器学习中的分类和回归问题
1. 分类问题 机器学习中的分类问题是一种监督学习任务,其核心目标是将数据样本分配到预定义的离散类别中,例如判断邮件是否为垃圾邮件、识别图像中的物体类型等。 分类通过已知标签的训练数据(如带类别标注的样本)学习特征与类别…...
pip命令
安装&卸载 -- 安装numpy pip install numpy1.26.4 -- 从索引安装(自定义源) pip install package_name --index-url https://custom_url -- 安装本地文件或目录 pip install /path/to/package.whl pip install D:\Downloads\transformers-4.40.0-py…...
n8n工作流自动化平台的实操:Cannot find module ‘iconv-lite‘
解决问题: 1.在可视化界面,执行const iconv require(iconv-lite);,报Cannot find module iconv-lite [line 2]错误; 查看module的路径 进入docker容器 #docker exec -it n8n /bin/sh 构建一个test.js,并写入如何代码 vi tes…...
AIGC时代——语义化AI驱动器:提示词的未来图景与技术深潜
文章目录 一、技术范式重构:从指令集到语义认知网络1.1 多模态语义解析器的进化路径1.2 提示词工程的认知分层 二、交互革命:从提示词到意图理解2.1 自然语言交互的认知进化2.2 专业领域的认知增强 三、未来技术图谱:2025-2030演进路线3.1 20…...
基于Springboot高校网上缴费综合务系统【附源码】
基于Springboot高校网上缴费综合务系统 效果如下: 系统登陆页面 个人中心页面 论坛交流页面 发表评论页面 付款页面 教师缴费页面 新增缴费类型页面 审核页面 研究背景 随着高校信息化建设进程的加速,传统手工缴费模式因效率低、错误率高、管理成本高…...
返回倒数第k个节点题解
这题要用到快慢指针的思想。 1.定义两个指针,一个快指针,一个慢指针,初始都指向头结点 2.先让快指针往后走k步,也就是移动k个节点,这个时候快指针比慢指针领先k 3.现在让快慢指针同时往后移动,两指针之间…...
《操作系统精髓与设计原理》第4章课后题答案-线程、对称多处理器和微内核
1.表3.5列出了在一个没有线程的操作系统中进程控制块的基本元素。对于多线程系统,这些元素中哪些可能属于线程控制块,哪些可能属于进程控制块? 对于不同的系统来说通常是不同的,但一般来说,进程是资源的所有者…...
《ATPL地面培训教材13:飞行原理》——第4章:亚音速气流
翻译:刘远贺;工具:Cursor & Claude 3.7;过程稿 第4章:亚音速气流 目录 翼型术语气流基础二维气流总结习题答案 翼型术语 翼型 一种能够以较高效率产生升力的特殊形状。 弦线 连接翼型前缘和后缘曲率中心的直…...
5月3日星期六今日早报简报微语报早读
5月3日星期六,农历四月初六,早报#微语早读。 1、五一假期多地政府食堂对外开放:部分机关食堂饭菜“秒没”; 2、2025年五一档电影新片票房破3亿; 3、首日5金!中国队夺得跳水世界杯总决赛混合团体冠军&…...
2024 虚拟电厂与大电网三道防线的关系探讨【附全文阅读】
本文围绕虚拟电厂与大电网三道防线展开探讨。大电网三道防线包括第一道防线的预防性控制和继电保护、第二道防线的稳控系统、第三道防线的失步解列及频率电压紧急控制装置 ,新型电力系统建设对第三道防线带来频率稳定等挑战。当前新型配电网第三道防线建设存在问题&…...
【c++】模板详解
目录 泛型编程模板的使用函数模板函数模板的本质函数模板的实例化显式实例化隐式实例化 函数模板的模板参数的匹配原则 类模板类模板的本质类模板的实例化 非类型模板参数模板特化函数模板特化类模板特化类模板全特化类模板偏特化(半特化) 模板分离编译t…...
【Linux】驱动开发方法
使用Petalinux学习驱动开发时的一些经验。 部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 基础——字符设备驱动 1.1 分配设备号(驱动入口使用)…...
BUUCTF——禁止套娃
BUUCTF——禁止套娃 进入靶场 一个近乎空白的页面 看一下框架 没什么有用的信息,扫个目录吧 只扫出来给flag.php,但是0B,估计又是个空网站 拼接访问一下 果然又是什么都没有 没有突破口 githack找找看看也没有源码吧 <?php include …...