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

STL?vector!!!

一、前言

        之前我们借助手撕string加深了类和对象相关知识,今天我们将一起手撕一个vector,继续深化类和对象、动态内存管理、模板的相关知识

二、vector相关的前置知识

        1、什么是vector?


        vector是一个STL库中提供的类模板,它是存储元素对象的顺序表,其中提供了一些有关增删查改的接口,它的特点是可以通过下标的方式在表中的任意位置进行读、写

        2、vector中的相关接口

        在本文接下来的部分会介绍vector的常用接口,事实上借助这些接口就可以解决平常所能遇到的大部分问题,如果还需要了解vector提供的更多接口及使用方法的话,可以跳转到一下网页:
        vector - C++ Referencehttps://legacy.cplusplus.com/reference/vector/vector/?kw=vector

三、手撕一个vector类

        1、成员变量与整体框架

        注意:之前的顺序表我们都是通过记录指针、元素个数和空间大小来完成的,顺序表的实现自然也可以这样,但是STL库中不是这样实现的,所以今天我们学习一下STL库中的实现方式

        

        上面的_start、_finish、_endofstorge分别代表着指向有效元素起始位置、终止位置的下一个位置和空间终止位置的迭代器,所以在上面我们已经定义了迭代器,事实上就是指针类型,这是由于顺序表的一大特点就是在内存中连续存储,所以可以直接使用未封装的指针;另一方面,我们在声明成员变量的同时都给了一个缺省值,这是由于它们都是指针类型,在初始化时我们都要先初始化成空指针再进行下一步操作,所以我们可以直接在这里给一个缺省值,这样避免了在初始化列表多次的显示初始化成空指针

        2、构造函数

        库中的函数头:
        

        以上的三个构造函数我们都会一一实现,在这里补充一点:在上面的构造函数中出现了"clloc",事实上,这是一个内存池,而后面所给的缺省值是STL库中提供的一个默认的内存池,它可以有效的提高开辟空间的时间消耗,但是比较复杂,所以在这里我们直接new空间,在之后,我们会专门的进行讲解

                (1).空构造:
                

                在这里实现的空构造是非常简单的,这是由于我们在声明时已经给了缺省值,但是该空构造是一定要写的,这是因为我们还要实现别的构造函数,这时候编译器就不在自动生成默认构造函数了

                (2).用n个元素对象进行初始化:
                

                在使用n个元素对象进行初始化时,我们在参数部分给了一个缺省值T(),很明显,这是一个匿名对象,同时调用了对应的默认构造函数,这是没有问题的,但是如果T是int、float等内置类型呢?事实上,这点不用担心,这是由于C++将这些内置类型都进行了升级,使它们可以象自定义类型一样调用默认构造函数,举个例子:如果T是int类型,那么此时T()就会返沪一个0进行初始化

                (3).使用一个迭代器区间进行初始化:
                

                在上面的构造函数中,我们再次使用了模板,但这里是函数模板,这是由于我们不仅要支持顺序表的迭代器类型初始化,还要支持其它类型的迭代器初始化

        3、返回顺序表一些性质的函数

                (1).size函数:返回此时vector中的元素个数

                库中的函数头:
                

                实现:
                

                (2).capacity函数:返回此时vector中的空间大小

                库中的函数头:
                

                实现:
                

        4、拷贝构造函数

        库中的函数头:

        

        实现:
        

        这里需要注意:我们不可以使用memcpy,这是由于memcpy会按字节将x的内容拷贝到_start,但如果T类型是动态开辟内存,也就是说是深拷贝的话,那么虽然vector整体进行了深拷贝,但是vector中的内容却只完成了浅拷贝,会出现深浅拷贝的问题,此时选择上面的方式就万无一失了,这要求元素对象重载了赋值运算符,这一点是必须的

        5、迭代器相关函数

                (1).begin函数:


                库中的函数头:
                

                begin函数进行了两个重载,分别是普通begin和const begin它们分别可以返回一个可读可写的迭代器和一个只读不写的迭代器,都指向vector的首元素位置:
                

                (2).end函数:


                库中的函数头:
                

                end函数仍然进行了两个重载,返回的迭代器都指向末尾元素的下一个位置:
                

        6、[]操作符重载

        库中的函数头:
        

        库中对[]操作符进行了两个重载,与上面的begin类似:
        

        库中对于很多类型进行了封装,事实上上面我们实现的与库中的本质是一样的

        7、交换函数

        库中的函数头:
        

        这里的交换一定是要涉及深拷贝的,在这里我们借用一下算法库中的swap函数,因为它恰好就是深拷贝:
        

        8、赋值运算符重载

        库中的函数头:
        

        在这里我们对该函数实现进行一点小改动,但是对于用户的使用来说是相同的:
        

        在上面的实现中,我们采用了传值传参,此时形参是实参的拷贝,拷贝会调用我们之前实现过的拷贝构造函数进行深拷贝,再调用swap函数,它也会进行深拷贝之下的交换,最终*this就变成了x的拷贝,最后x这一拷贝出作用域销毁,调用析构函数(后面会实现),进行了空间的释放

        9、开空间相关函数

                (1).reserve函数:会开辟指定大小的空间,如果原来有元素,会进行拷贝,否则不进行任何处理

                库中的函数头:
                

                实现:
                

                在上面我们又遇到了象拷贝构造函数同样的问题,所以再次使用了赋值运算符重载的方式进行处理

                (2).resize函数:会开辟指定大小的空间,用val进行初始化,缺省值为T()

                库中的函数头:
                

                实现:
                

                这里我们直接对之前的函数进行复用即可

        10、插入相关函数

                (1).insert函数:在迭代器指定的位置直接插入一个值,返回最后该位置的迭代器

                库中的函数头:
                

                实现:
                

                从上面的代码可以看出:在insert函数内部可能开辟空间,这时候pos就不是原来的pos了,所以在函数外部,传给过insert函数的迭代器是不能再次使用的,因为使用过的迭代器可能已经失效,这时候我们通过反回值的方式解决了这个问题,所以如果想再次使用的话,要接受函数的返回值

                (2).push_back函数:在vector尾部插入一个对象

                库中的函数头:
                

                实现:
                

                事实上在这个位置我们直接复用刚才写过的insert就非常方便

        11、删除相关函数

                (1).erase函数:删除迭代器指定位置的元素,返回该位置的迭代器

                库中的函数头:
                

                实现:
                

                erase所删除的位置有可能是最后一个,此时删除之后传入的迭代器·就失效了,所以要接收返回值并判断

                (2).pop_back函数

                库中的函数头:

                

                实现:
                

                直接复用刚才写过的erase函数即可

        12、析构函数

        由于析构函数的特殊性,这里就不提供库中的函数头了:

        

四、vector

        下面就是我们今天一起完成的vector了:
        

#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;
namespace bea
{template<class T>class vector{typedef T* iterator;typedef const T* const_iterator;public://空构造vector() {}//用n个元素对象进行初始化vector(size_t n, const T& val = T()){_start = new T[n + 5];for (size_t i = 0; i < n; i++){_start[i] = val;}_finish = _start + n;_endofstorge = _start + n + 4;}//使用一个迭代器区间进行初始化template<class InputIterator>vector(InputIterator first, InputIterator last){size_t n = last - first;_start = new T[n + 5];InputIterator it1 = first, it2 = _start;while (it1 < last){*it2 = *it1;it1++, it2++;}_finish = _start + n;_endofstorge = _start + n + 4;}//拷贝构造函数vector(const vector& x){size_t sz = x.size();_start = new T[sz + 5];for (size_t i = 0; i < sz; i++){_start[i] = x._start[i];}_finish = _start + sz;_endofstorge = _start + sz + 4;}//size函数size_t size() const{return _finish - _start;}//capacity函数size_t capacity() const{return _endofstorge - _start + 1;}//begin函数iterator begin(){return _start;}const_iterator begin() const{return _start;}//end函数iterator end(){return _finish;}const_iterator end() const{return _finish;}//[]操作符重载T& operator[](size_t pos){assert(pos < size());return _start[pos];}const T& operator[](size_t pos) const{assert(pos < size());return _start[pos];}//交换函数void swap(vector& x){std::swap(x._start, _start);std::swap(x._finish, _finish);std::swap(x._endofstorge, _endofstorge);}//赋值运算符重载vector& operator=(const vector x){swap(x);return *this;}//开空间相关函数void reserve(size_t n){size_t sz = size();if (n <= size()) return;iterator tmp = new T[n + 5];if (_start){for (size_t i = 0; i < sz; i++){tmp[i] = _start[i];}delete[] _start;}_finish = tmp + sz;_start = tmp;_endofstorge = tmp + n + 4;}//insert函数iterator insert(iterator pos, const T& val){assert(pos <= _finish);int n = pos - _start;if (capacity() < size() + 1){reserve(size() + 5);}pos = _start + n;iterator end = _finish - 1, next = _finish;while (next > pos){*next = *end;end--, next--;}*pos = val;_finish++;return pos;}void push_back(const T& val){insert(_finish, val);}void resize(size_t n, T& val = T()){vector(n, val);}//erase函数iterator erase(iterator pos){assert(pos < _finish);iterator end = pos + 1, front = pos;while (end < _finish){*front = *end;front++, end++;}_finish--;if (pos == _finish) return nullptr;else return pos;}//pop_back函数void pop_back(){erase(_finish - 1);}//析构函数~vector(){delete[] _start;_start = nullptr;_finish = nullptr;_endofstorge = nullptr;}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _endofstorge = nullptr;};
}

五、结语

        这就是我们所实现的vector的全部内容了,我们的目的仍然是了解vector的用法、加深类和对象和模板等知识点的理解,感谢大家的阅读,欢迎各位于晏、亦菲和我一起交流、学习、进步!

                

               

相关文章:

STL?vector!!!

一、前言 之前我们借助手撕string加深了类和对象相关知识&#xff0c;今天我们将一起手撕一个vector&#xff0c;继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector&#xff1f; vector是一个STL库中提供的类模板&#xff0c;它是存储…...

Android SDK

Windows纯净卸载Android SDK 1.关闭所有安卓相关的程序 Android StudioEmulators 如模拟器Command prompts using SDK 如appium服务 2.移除SDK相关目录 # Delete your SDK directory F:\android_sdk\android-sdk-windows# Also check and remove if present: $env:LOCALAPP…...

老旧 LabVIEW 系统升级改造

在工业自动化领域&#xff0c;LabVIEW 凭借其直观的图形化编程方式和强大的数据处理能力&#xff0c;成为开发测试测量与控制系统的主流平台。然而&#xff0c;随着技术的快速迭代和业务需求的不断变化&#xff0c;许多早期开发的 LabVIEW 系统逐渐暴露出性能不足、功能缺失或兼…...

【IDEA_Maven】(进阶版)永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径

【IDEA_Maven】永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径 问题解决 问题 Maven使用在线导入&#xff0c;在网络不佳时&#xff0c;往往加载很慢。十分浪费时间&#xff0c;所以我们需要在maven官网找到合适版本的maven&#xff0c;将其压缩包下载下来…...

VSCode远程无法选择虚拟环境问题

1. 无法选择虚拟环境 1.先保证扩展安装正确&#xff0c; 安装python&#xff0c;pylance和intelliCode 2. 直接在设置&#xff08;ctrl shift p&#xff09;里面搜索&#xff0c;点击“Python:Select Interpreter”选项 3. 可能有人会出现第三步的问题&#xff0c;参考链接…...

七、Hadoop 历史追踪、数据安全阀与 MapReduce初体验

Hadoop 实战拾遗&#xff1a;作业历史追踪、数据安全阀与 MapReduce 巧算 π 一、追溯作业足迹&#xff1a;JobHistory Server 的配置与使用 Hadoop 集群高效运行的背后&#xff0c;离不开对已完成作业的细致分析。JobHistory Server (JHS) 就像是作业的“黑匣子”&#xff0…...

【MySQL】联合查询

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、什么是联合查询 1.概念 2.语法要求 3.示例 4.为什么要使用联合查询 内连接 1.概念 2.语法 3.步骤&#xff1a; 外连接 1.概念 2.分类&#xff1a; 左外连…...

Java 原生实现代码沙箱(OJ判题系统第1期)——设计思路、实现步骤、代码实现

设计思路&#xff1a; 1、保存代码文件 ✅ 目的&#xff1a; 将用户提交的源码以字符串形式写入磁盘&#xff0c;生成 .java 文件。 &#x1f4cc; 原因&#xff1a; Java 是静态语言&#xff0c;必须先编译成 .class 文件才能运行。 需要物理文件路径来调用 javac 或使用 Java…...

课程设计。。。。

人脸考勤系统 需求分析 需求 1.实现企业日常人脸打卡需求 2.管理员要可以管理相关数据 3.可以移植到相关嵌入式设备 …..需求主要是这些&#xff0c;还可以让ai拓展一点 实现 1.介于可移植性这个需求&#xff0c;选用Qt框架&#xff0c;Qt框架跨平台性特比好&#xff0…...

gitlab相关面试题及答案

一、GitLab 基础 1. 什么是 GitLab&#xff1f;它与 GitHub 有什么区别&#xff1f; 答案&#xff1a; GitLab 是一个开源的 DevOps 平台&#xff0c;提供代码托管、CI/CD、问题跟踪等功能。与 GitHub 的主要区别&#xff1a; 开源与商业&#xff1a;GitLab 社区版开源&#x…...

『不废话』之Python 3.14 Beta版新特性

Python 3.14 的第一个Beta版已发布&#xff0c;有几个新特性可以提高我们的编码效率。 未来注释 在上一篇《『不废话』之Python高级特性技巧-CSDN博客》中提到3.7中新增了 “未来注释”&#xff0c;可以使用“from __future__ import annotations”或双引号包括的方式解决当类…...

AWS之数据分析类产品

以下是 Amazon Athena、Amazon QuickSight、AWS Lake Formation、AWS Glue、Amazon OpenSearch Service&#xff08;原 Elasticsearch Service&#xff09;、Amazon Kinesis Data Analytics 和 Amazon Redshift 的核心区别及典型使用场景的对比分析&#xff1a; 1. Amazon Athe…...

RabbitMQ消息的重复消费问题如何解决?

在RabbitMQ中&#xff0c;消息重复消费是一个常见问题&#xff0c;它通常发生在消费者处理消息时出现网络波动、节点故障或消费者自身处理逻辑异常&#xff0c;ACK 失败等情况&#xff0c;都会导致RabbitMQ 不能够正确感知消息已被成功处理&#xff0c;从而重新投递消息。以下是…...

5月9号.

v-for: v-bind: v-if&v-show: v-model: v-on: Ajax: Axios: async&await: Vue生命周期: Maven: Maven坐标:...

如何减少极狐GitLab 容器镜像库存储?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 减少容器镜像库存储 (BASIC ALL) 未清理的容器镜像库会随着时间的推移而变大。添加大量镜像或标签时&#xff1a; 获取可用标…...

怎么用idea打jar包

背景 前端使用vue开发&#xff0c;打包生成dist文件&#xff0c;需要打包成jar包 步骤 前端的dict文件放到后端的src\main\resources目录下dict文件夹改名为staticidea打开后端代码&#xff0c;依次点击右侧maven下的clean 、package最后会在项目的target目录下生成jar&…...

03 mysql 连接

安装 MySQL 后,我们就需要连接它。 使用命令行方式连接使用图形化工具连接一、使用命令行客户端连接 在上一节内容02 mysql 管理(Windows版)-CSDN博客 我们采用的就是这个连接方法,这种方法直接连接的是root用户,找到该命令行属性,打开可以看到里面的参数是root: 这种…...

Jenkins集成Maven

一、概述 Jenkins是一个开源的持续集成工具&#xff0c;用于自动化各种开发任务。Maven是一个项目管理和构建自动化工具&#xff0c;主要用于Java项目。通过将Jenkins和Maven集成&#xff0c;可以实现自动化构建、测试和部署&#xff0c;提高开发效率和代码质量。 二、前提条…...

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen&#xff08;通义千问&#xff09;智能体框架是阿里云推出的新一代AI智能体开发平台&#xff0c;其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计&#xff0c;将L…...

Linux——MySQL基础

基础知识 连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -p -h 指明登录部署了myqsl服务的主机 -P 指明访问的端口号 -u 指明用户 -p 指明登录密码&#xff08;可以不填写&#xff09; 什么是数据库 首先&#xff0c;数据库是分为服务端和客户端的&#xff1a; mysql是客户…...

k8s监控方案实践(二):集成Alertmanager告警与钉钉Webhook通知

k8s监控方案实践&#xff08;二&#xff09;&#xff1a; 集成Alertmanager告警与钉钉Webhook通知 文章目录 k8s监控方案实践&#xff08;二&#xff09;&#xff1a; 集成Alertmanager告警与钉钉Webhook通知一、Alertmanager简介1. 什么是Alertmanager&#xff1f;2. Promethe…...

学习threejs,使用Physijs物理引擎

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

UG471 之 SelectIO 逻辑资源

背景 《ug471》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resources》介绍了输入输出数据…...

基于HISI3519dv500的yolov8-obb车位检测

1. 数据标注 标注软件&#xff1a;roLabelImg 安装方式&#xff1a;见 https://github.com/cgvict/roLabelImg.git 操作指南&#xff1a; 标注后的数据格式如下&#xff1a; <annotation verified"no"><folder>4800</folder><filename>fr…...

Prometheus生产实战全流程详解(存储/负载/调度篇)

一、存储架构实战&#xff08;TSDB深度优化&#xff09; 1. 存储拓扑设计 2. 关键参数调优 4. 性能压测对照表 二、负载治理实战&#xff08;百万级Series管控&#xff09; 三、调度优化实战&#xff08;精准采集控制&#xff09; 2. 优先级调度配置 3. 自适应抓取调整 4…...

Mac电脑远程连接window系统服务器

1.下载 首先需要下载Microsoft Remote Desktop软件&#xff0c;下载链接如下&#xff1a; https://go.microsoft.com/fwlink/?linkid868963 2、软件下载成功后&#xff0c;可按照引导程序进行安装&#xff0c;成功后进入软件&#xff0c;可看到如下界面&#xff1a;...

【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64

【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64 目录 【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64准备工作&#xff1a;&#xff08;必须&#xff09;第一步&#xff1a;第二步&#xff1a;第三步&#xff1a; 建议…...

【Qt】之【Bug】点击按钮(ui->pushButton)触发非本类设置的槽函数

解决 先说解决办法&#xff0c;按钮在ui为默认命名ui->pushButton,后面改了下按钮名为该按钮的功能相关&#xff0c;就不会随意触发其他槽函数了。 没想到是这个原因。。。 可能是之前默认的objectName与旧的槽函数自动连接了 记录一下&#xff0c;找了好久其他的原因。 以…...

buck和boost总结

目录 1. 基本概念与原理 2. 工作模式 3. 典型应用场景 4. Buck-Boost电路&#xff1a;升降压结合 5. 核心区别与选择 1. 基本概念与原理 Buck电路&#xff08;降压电路&#xff09; 通过开关器件&#xff08;如MOSFET&#xff09;周期性地导通和关断&#xff0c;控制电感充…...

rtsp,。。。。

下面是基于 FFmpeg H.264 RTSP GStreamer 的低延时视频传输方案的详细搭建指南。此方案可将延迟控制在 <100ms&#xff0c;适合远程驾驶、监控等实时性要求较高的应用场景。 &#x1f4e6; 方案架构 摄像头&#xff08;OpenCV&#xff09;→ FFmpeg&#xff08;H.264编码…...

微信小程序地图缩放scale隐性bug

bug1 在真机环境下通过this.mapCtx.getScale获取当前地图的缩放等级带小数&#xff0c; 当设置scale带小数时&#xff0c;地图会先执行到缩放到带小数的缩放等级&#xff0c;然后会再次缩放取整的缩放等级&#xff08;具体向上取整还是向下取整未知&#xff0c;两种情况都观察…...

Java中关于多态的总结

多态是面向对象编程的三大特性之一&#xff08;封装、继承、多态&#xff09;&#xff0c;它允许不同类的对象对同一消息做出不同的响应。 多态的基本概念 1、定义 多态(Polymorphism)指同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c;产生不同的执行结果…...

突破跨界传输瓶颈:Zynq OCM与DDR核间数据共享性能深度调优

一、当硬件加速遇上内存墙:Zynq数据共享的终极挑战 在某军工雷达信号处理项目中,工程师小王遇到了棘手难题——通过Zynq的ARM核与FPGA协同处理雷达回波数据时,系统吞吐量始终无法突破200MB/s的瓶颈。经过三天三夜的排查,发现问题的根源竟是OCM与DDR之间的数据传输效率不足…...

基于 Ubuntu 24.04 部署 WebDAV

无域名&#xff0c;HTTP 1. 简介 WebDAV&#xff08;Web Distributed Authoring and Versioning&#xff09;是一种基于 HTTP 的协议&#xff0c;允许用户通过网络直接编辑和管理服务器上的文件。本教程介绍如何在 Ubuntu 24.04 上使用 Apache2 搭建 WebDAV 服务&#xff0c;无…...

JVM、JRE、JDK的区别

JVM JVM全称Java虚拟机(Java Virtual Machine, JVM),它是运行java字节码的虚拟机&#xff0c;JVM针对不同的系统有不同的实现&#xff0c;目的运行相同的字节码有同样的结果&#xff0c;JVM是“一次编译&#xff0c;到处运行”实现的关键。如下不同的编程语言编译生成字节码文…...

解密火星文:LeetCode 269 题详解与 Swift 实现

文章目录 摘要描述题解答案题解代码分析构建图&#xff08;Graph&#xff09;拓扑排序&#xff08;Topological Sort&#xff09; 示例测试及结果时间复杂度空间复杂度实际场景类比总结 摘要 这篇文章我们来聊聊 LeetCode 269 题&#xff1a;火星词典&#xff08;Alien Dictio…...

系统思考:短期困境与长期收益

最近在项目中&#xff0c;一直有学员会提到一个议题&#xff0c;如何平衡当前困境和长期收益&#xff1f; 我的思考是在商业和人生的路上&#xff0c;我们常常听到“鱼和熊掌不可兼得”的说法&#xff0c;似乎短期利益和长期目标注定是对立的。但事实上&#xff0c;鱼与熊掌是…...

K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战

引言 在 Kubernetes 环境中&#xff0c;容器镜像的存储与管理至关重要。企业级镜像仓库&#xff08;如 Harbor&#xff09;为团队提供了安全、稳定、可扩展的镜像管理解决方案。 一、Harbor 安装与配置 Harbor 是由 VMware 开源的企业级云原生镜像仓库&#xff0c;它不仅支持…...

2025-05-10-FFmepg库裁切有水印的视频

裁后 代码 import subprocess# 文件路径 input_video_path "bg_video.mp4" output_video_path "output_video_cropped.mp4"# 裁剪视频下方的水印 def crop_video(input_video_path, output_video_path, crop_height):# 获取视频的分辨率def get_video…...

通信协议选型篇:如何根据项目需求选择合适的通信协议?

🧭 本文为《嵌入式通信协议全解析》第七篇,面向系统架构师、嵌入式开发者与技术决策者,提供一套实用的通信协议选型方法论,结合性能对比表、使用案例与决策树,助你在“带宽、功耗、距离、可靠性、生态”之间做出最优权衡。 🔍 一、为什么通信协议的选型很关键? 在嵌入…...

Altera系列FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供4套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄像头输入Sensor之…...

大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统。 在2025年AI技术快速发展的背景下,大模型已展现出在教育领域的巨大潜力。通义千问Qwen3作为阿里云推出的最新一代…...

【强化学习】动态规划(Dynamic Programming, DP)算法

1、动态规划算法解题 LeetCode 931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选…...

【Linux】深入拆解Ext文件系统:从磁盘物理结构到Linux文件管理

目录 1、理解硬件 &#xff08;1&#xff09;磁盘 &#xff08;2&#xff09;磁盘的物理结构 &#xff08;3&#xff09;磁盘的存储结构 &#xff08;4&#xff09;磁盘的逻辑结构 &#xff08;5&#xff09;CHS && LBA地址 2、引入文件系统 &#xff08;1&…...

linux ptrace 图文详解(八) gdb跟踪被调试程序的子线程、子进程

目录 一、gdb跟踪被调试程序的fork、pthread_create操作 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; …...

【列表类型】

1、按索引取值 索引可正向存取&#xff0c;也可反向存取 l [111, paipai, cat] # 正向取值 print(l[1]) # 方向取值 print(l[-1]) # 通过索引给列表重新赋值,前提&#xff1a;索引存在 l[0] ccat print(l) # 索引不存在的情况下&#xff0c;取值or重新赋值的情况下都会报错 …...

MySQL 8.0 OCP 英文题库解析(二)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免费考取 原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题6~15。 试题6: …...

数据分析与逻辑思维:六步解决业务难题;参考书籍《数据分析原理:6步解决业务分析难题 (周文全, 黄怡媛, 马炯雄)》

文章目录 一、懂业务&#xff1a;业务背景与逻辑前提1.1 明确业务目标与问题定义1.2 培养批判性思维与高于业务视角 二、定指标&#xff1a;构建科学的指标体系2.1 指标拆解与维度分析2.2 典型指标体系案例&#xff1a;用户与业务视角 三、选方法&#xff1a;匹配业务需求的分析…...

人力资源管理系统如何有效提高招聘效率?

在传统招聘模式下&#xff0c;企业招聘常常陷入 “泥潭”。HR 每天需要花费大量时间在海量简历中 “大海捞针”&#xff0c;手动筛选、电话沟通、安排面试&#xff0c;流程繁琐且效率低下。好不容易邀约到候选人&#xff0c;却因面试安排冲突、信息传递不及时等问题&#xff0c…...

FAISS 与机器学习、NLP 的关系

FAISS&#xff08;Facebook AI Similarity Search&#xff09;是一个用于高效相似性搜索和密集向量聚类的开源库&#xff0c;由 Facebook AI Research 开发。它在机器学习&#xff08;特别是自然语言处理&#xff0c;NLP&#xff09;领域中扮演着重要角色&#xff0c;主要解决大…...