vector的模拟实现
目录
一、构造和析构函数
二、插入删除访问迭代器
三、迭代器失效
四、拷贝构造和赋值
五、tip
一、构造和析构函数
namespace stn
{template<class T>class vector{typedef T* iterator;public:vector():_start(nullptr);, _end(nullptr), _endofstorage(nullptr){ }~vector(){delete[]_start;_start = _finish = _endofstorage = nullptr;}private:iterator _start;iterator _finish;iterator _endofstorage;};
}
start相当于迭代器的begin,finish相当于size的位置,endofstorage相当于end
二、插入删除访问迭代器
void push_back(const T& x){if (_finish == _endofstorage){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;T* tmp = new T[capacity];if (_start){memcpy(tmp, _start, sizeof(T) * size());delete[] _start;}_start = tmp;_finish = _start + size();_endofstorage = _start + newcapacity;}*_finish = x;++_finish;}size_t capacity(){return _endofstorage - _start;}size_t size(){return _finish - _start;}
当空间不够的时候我们就需要开辟新空间,然后把旧空间的数据拷贝过去然后释放旧空间
我们运行以后就会发现这个代码是有错误的,原因就出在_finish上,start我们已经指向了新空间,但是你finish还是旧空间的finish,通俗的来讲,你start+size(),最后得到的是旧空间的finish那你新空间使用旧空间的finish肯定是不行的,所以这里我们要改成使用新空间的start也就是tmp,而且size我们需要的是旧空间的size,所以_start得放在下面
_finish =tmp+ size();_start = tmp;_endofstorage = _start + newcapacity;
改进成这样子就可以了
这个是访问
T& operator[](size_t pos){assert(pos < size());return _start[pos];}
我们再搞一下迭代器
iterator begin(){return _start;}iterator end(){return _finish;}
vector<int>::iterator it = v.begin();
while (it != v.end())
{cout << *it << " ";++it;
}cout << endl;
for (auto e : v)
{cout << e << " ";
}
注意这里的iterator要把它放到公有的要不然不能够进行访问
既然有了普通迭代器可读可写自然也要有不能被修改的迭代器const迭代器
typedef T* const_iterator;
const_iterator begin()const
{return _start;
}
const_iterator end()const
{return _finish;
}
指向的内容不能被修改
const T& operator[](size_t pos)const{assert(pos < size());return _start[pos];}
三、扩容删除逻辑
void reserve(size_t n){if (n > capacity()){T* tmp = new T[n];size_t sz = size();if (_start){memcpy(tmp, _start, sizeof(T) * size());delete[] _start;}_finish = tmp + sz;_start = tmp;_endofstorage = _start+n;}}
写了reserve我们的pushback就可以去根据reserve的逻辑去搞了
void push_back(const T& x)
{if (_finish == _endofstorage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;}
resize我们参照一下库里面的写法
value_type就是T,
/*void resize(size_t n, T val = T())*/
void resize(size_t n,const T& val = T())
可以写这两种写法,有人说为什么不同0来充当缺省值,因为T是模板,在不同的环境下就需要不同的缺省值,比如你是指针我们就给空指针,匿名对象的本质就是去走初始化列表进行构造,我去构造出一个空指针或者int或者什么的就可以适用于各种类型,有人说int是内置类型怎么能走构造,因为c++官方为了让这种东西进行通用进行了升级,这两种写法本质上都是一样的,const&会延长匿名对象的生命周期
int j(1);
cout << j << endl;
我这样子初始化都是可以的
void resize(size_t n,const T& val = T())
{if (n <= size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}
}
小了就删除,大了话我们直接reserve反正没有大于capacity的话reserve也不会起到作用,超过的话就执行扩容加插入
vector<string> v;v.resize(10, "x");for (auto e : v){cout << e << " ";}
这里是单参数的构造支持隐式类型的转换
三、迭代器失效
void insert(iterator pos, const T& x)
{assert(pos >= _start);assert(pos <= _finish);if (_finish == _endofstorage){reserve(capacity() == 0 ? 4 : capacity() * 2);}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;
}
这里等于的原因是走到pos位置你还要把pos这个位置向后挪动才算结束
我们插入的时候发现会有随机值
这是怎么回事呢
我们pos在移动的过程中倘若空间不够发生了扩容,其他的变量都移到新空间去了,但是pos随着旧空间一起释放掉了,所以我们的pos也要随着新空间的改变而改变 ,还要记录下原本空间pos相对于start的相对位置
void insert(iterator pos, const T& x)
{assert(pos >= _start);assert(pos <= _finish);if (_finish == _endofstorage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;
}
那我们用pushback复用一下这个吧
void push_back(const T& x)
{insert(end(), x);}
auto it = v.begin() + 1;v.insert(it, 30);
这里的it也会失效,因为it是传值pos的改变不会影响it ,所以我们认为insert插入后it就失效了,不能访问,有人说引用可不可以,库里面是没有的
我们也会发现是编译不过的,因为引用要的是变量,如果说我们这里传的是V.begin(),这个东西返回的是临时对象,而临时对象具有常性,所以说我们不要用这种东西,用传值拷贝就好了
那我们再来看一下erase
void erase(iterator pos)
{assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it<_finish){*(it-1)=* it ;it++;}_finish--;
}
这个跟上面差不多我就不多过阐述了
我们来看一下erase的迭代器失不失效
迭代器失效:
如果失效就不能在使用这个迭代器,如果使用了结果是未定义的
大家可能都认为这个是不失效的,但是这个其实是失效的,一般场景下不会,但是有一个场景会
void testvector4()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);auto it = v.begin();while (it != v.end()){if (*it % 2 == 0){v.erase(it);}it++;}
}
当我们要删除偶数的时候迭代器就会失效
第一种情况下加到2了以后3往前挪,,指针到4了,3这个我们就没有进行一个很好的判断
第二种情况当最后一个是偶数的时候就想图中所写一样
所以vs2019进行强制检查,erase以后认为it失效了,不能访问,访问就报错
那我们看一下库里面的做法
这段话的意思是erase返回的是被删除位置的下一个位置
auto it = v.begin();
while (it != v.end())
{if (*it % 2 == 0){it= v.erase(it);}elseit++;
}
iterator erase(iterator pos)
{assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;it++;}_finish--;return pos;
}
所以我们把返回值改变一下就可以了
结论:insert和erase以后迭代器都失效了,不能再访问
我们再来看下一段测试
void testvector5(){vector<string> v;v.push_back("1111111111111111111");v.push_back("1111111111111111111");v.push_back("1111111111111111111");v.push_back("1111111111111111111");v.push_back("1111111111111111111");for (auto e : v){cout << e << " ";}}
}
会出现这个问题,为什么呢
这里就涉及到一个深层次的浅拷贝的问题,memcpy把里面的东西_start指向的东西全都拷贝下来,但是string里面指向的东西没有改变也拷贝了下来,到时候你释放旧空间的时候就会先把指向的东西里面给清除掉 ,我们拷贝下来的就变成了野指针了,所以就不能使用memcpy这个东西,我们用一个循环慢慢拷贝就好了
void reserve(size_t n){if (n > capacity()){T* tmp = new T[n];size_t sz = size();if (_start){for (int i = 0; i < size(); i++){tmp[i] = _start[i];}delete[] _start;}_finish = tmp + sz;_start = tmp;_endofstorage = _start + n;}}
[]拷贝值的时候传回来的是引用,你tmp就是复制
我来阐述一下用memcpy的时候它就相当是被动的被它拷贝下去,而用循环赋值就是复制下去,string会主动分配一块新的内存给指向的内容两个已经存在的对象只能用赋值,调用的是自定义类型的赋值重载
四、拷贝构造和赋值
vector(const vector<T>& v):_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{reserve(capacity());for (auto& e : v){push_back(e);}
}
这里const对象不能调用非const成员函数
size_t capacity()const
{return _endofstorage - _start;
}
size_t size()const
{return _finish - _start;
}
所以这里也要稍作修改
void swap(vector<T>& v)
{std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);
}
vector<T>& operator=(vector<T> tmp)
{swap(tmp);return *this;
}
这里看不懂的可以去看一下我之前写的string的模拟实现
比如说你v1=v3,this就是v1,tmp就是v3的拷贝,你把自己的丢给tmp,把v3里面要的东西拿过来,顺便让tmp帮自己释放一下
五、tip
看最后一行跟我们写的不太一样这也是设计不太合理的地方
void swap(vector<T>& v)
void swap(vector& v)
你写成这样也是可以的,是类名也是类型
template <class InputIterator>
vector(InputIterator first, InputIterator last)
{while (first != last){push_back(*first);
++first;}
}
我们不是有各种各样的迭代器区间吗,写成类模板就可以使用各种各样的迭代器
那我们内置类型编译器不确定一定会处理所以我们改一下
vector()
{
}
iterator _start=nullptr;
iterator _finish = nullptr;
iterator _endofstorage = nullptr;
上面那个一定要写,我们不写编译器会生成默认的拷贝构造,但是我们还写了其他的很多构造,原始构造也要有
这种情况下就会出问题,因为它会去找最匹配的,而左边的明显比右边匹配所以我们还要写一个模板出来应对这种情况
vector(int n, const T& val = T())
{reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}
}
vector就到这里结束了,接下来进入链表的部分,写的不好的地方欢迎大家指出
相关文章:
vector的模拟实现
目录 一、构造和析构函数 二、插入删除访问迭代器 三、迭代器失效 四、拷贝构造和赋值 五、tip 一、构造和析构函数 namespace stn {template<class T>class vector{typedef T* iterator;public:vector():_start(nullptr);, _end(nullptr), _endofstorage(nullptr){…...
【高可用】keepalived的试用与学习笔记
版本日期修订人描述V1.02025/2/23nick huang创建文档 背景 最近,预研给现有的Nginx单点实例添加故障转移的功能,以备单实例故障时无法快速恢复。 本文记录Keepalived的学习笔记,供自己或同学日后参考。 Keepalived Keepalived是一个开源的…...
在Dify中实现联网检索功能(模拟DeepSeek)
跟着上一篇博客:Error response from daemon: Get “https://registry-1.docker.io/v2/“: request canceled while的解决办法-CSDN博客 DeepSeek发布之后,感觉联网检索功能变成标配了。这篇博客简单介绍一下怎么在Dify中配置初步的联网检索功能&#x…...
Deepseek-强化学习算法(通俗易懂版)
首先先贴一张Deepseek核心技术的梳理图: 上图详细了讲述了Deepseek主要在哪些阶段用了强化学习方法(GRPO) 1.GRPO算法 GRPO是一种用于提高语言模型推理能力的强化学习算法。它在DeepSeekMath论文中,在数学推理的背景下被提出。G…...
[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植
最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台,现在已经移植了,尝试了下效果,降噪效果很显著,噪声带被显著抑制了 降噪前: 降噪后:...
了解 RAG 第二部分:经典 RAG 的工作原理
在本系列的第一篇文章中,我们介绍了检索增强生成 (RAG) ,解释了扩展传统大型语言模型 (LLM)功能的必要性。我们还简要概述了 RAG 的核心思想:从外部知识库检索上下文相关的信息,以确保 LLM 生成准确且最新的信息,而不会…...
剖析IO原理和零拷贝机制
目录 1 Linux的五种IO模型1.1 模型调用的函数1.1.1 recv函数1.1.2 select函数1.1.3 poll函数1.1.4 epoll函数1.1.5 sigaction函数 1.2 IO模型1.2.1 阻塞IO模型1.2.2 非阻塞IO模型1.2.3 IO复用模型1.2.4 信号驱动IO模型1.2.5 异步IO模型1.2.6 IO模型比较 2 Java的BIO、NIO、AIO2…...
【论文精读】MapTR:用于在线矢量化高精地图构建的结构化建模与学习
论文地址: MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION 源代码:MapTR 摘要 High-definition(HD Map)map为自动驾驶场景提供了丰富且精确的环境信息,是自动驾驶系统规划中不…...
云图库平台(五)——后端图片模块开发
目录 一、需求分析二、库表设计三、图片的处理如何实现图片的上传和下载创建图片的业务流程如何对图片进行解析 四、创建并使用对象存储五、后端操作对象存储初始化客户端通用能力类文档上传文件下载 一、需求分析 管理员功能: 图片的上传和创建:仅管理…...
Linux红帽:RHCSA认证知识讲解(一)RedHat背景与环境配置
Linux红帽:RHCSA认证知识讲解(一)RedHat背景与环境配置 前言一、RedHat公司背景二、RedHat环境安装步骤三、windows使用远程工具连接环境并上传文件到redhat方法: 前言 在接下来的博客中,我们从基础开始将介绍红帽Linu…...
【Linux】基于UDP/TCP套接字编程与守护进程
目录 一、网路套接字编程 (一)基础概念 1、源IP地址与目的IP地址 2、端口号 3、TCP与UDP 4、网络字节序 (二)套接字编程接口 1、socket 常见API 2、sockaddr结构 (三)UDP套接字 1、UDP服务器创建…...
Linux CentOS 上 Ollama 的安装与部署:从入门到实践
Linux CentOS 上 Ollama 的安装与部署:从入门到实践 随着人工智能技术的快速发展,大语言模型(LLMs)的应用场景越来越广泛。Ollama 作为一个轻量级的 AI 模型管理工具,为开发者提供了便捷的模型部署和管理解决方案。本文将详细介绍如何在 Linux CentOS 系统上安装和部署 O…...
大数据学习之任务流调度系统Azkaban、Superset可视化系统
一.任务流调度系统Azkaban 1.课程介绍 2.为什么需要工作流调度系统 3.AZKABAN是什么 4.AZKABAN下载 5.制作安装包 6.tar包准备 7.MYSQL配置AZKABAN 8.配置EXECUTOR SERVER 9.配置WEBSERVER 10.单作业实战_yaml语言(今天稍晚更新) 11.单作业实战 12.多作业依赖实战 13.失败自动重…...
网络空间安全(2)应用程序安全
前言 应用程序安全(Application Security,简称AppSec)是一个综合性的概念,它涵盖了应用程序从开发到部署,再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义:应用程序安全是指识别和修复应用程序…...
UDP、TCP的区别
UDP(用户数据报协议)和TCP(传输控制协议)是两种常用的传输层协议,它们在数据传输方式、可靠性和应用场景等方面有显著区别。以下是它们的主要区别: ### 1. 连接方式 - **TCP**:面向连接。通信前…...
Linux 第二次脚本作业
1、需求:判断192.168.1.0/24网络中,当前在线的ip有哪些,并编写脚本打印出来。 2、设计一个 Shell 程序,在/userdata 目录下建立50个目录,即 user1~user50,并设置每个目录的权限,其中其他用户的权…...
高清下载油管视频到本地
下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...
Linux 命令大全完整版(07)
2. linux 系统设置命令 ulimit 功能说明:控制 shell 程序的资源。语法:ulimit [-aHS][-c <core 文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小…...
基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志
一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…...
Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用
功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…...
高速差分信号的布线
差分信号如何在PCB上布线? 1.差分信号必须保证线间距相等,禁止打过孔或者放置元器件 2.差分信号必须打孔时,必须要保证伴随屏蔽地过孔(缝合定位孔),减少信号干扰问题。 3.差分信号走线弯曲位置推荐&#…...
用openresty和lua实现壁纸投票功能
背景 之前做了一个随机壁纸接口,但是不知道大家喜欢对壁纸的喜好,所以干脆在实现一个投票功能,让用户给自己喜欢的壁纸进行投票。 原理说明 1.当访问http://demo.com/vote/时,会从/home/jobs/webs/imgs及子目录下获取图片列表&…...
智能测试执行 利用算法 利用图像识别、自然语言处理等技术实现自动化测试执行
以下将从Web应用和移动应用两个方面,给出利用图像识别、自然语言处理等技术实现自动化测试执行的实例,并附上部分代码示例。 Web应用自动化测试实例:模拟用户登录操作测试 需求理解 对于一个Web应用的登录功能进行自动化测试,我们可以结合自然语言处理理解测试用例描述,…...
AI学习之-阿里天池
阿里天池(Tianchi)是阿里巴巴集团旗下的一个数据科学与人工智能竞赛平台,致力于推动数据科学和人工智能的发展。在天池平台上,人们可以参与各种数据竞赛和挑战,解决实际问题,提升数据科学技能。天池平台提供…...
AGI觉醒假说的科学反驳:从数学根基到现实约束的深度解析
文章目录 引言:AGI觉醒论的核心迷思一、信息论视角:意识产生的熵约束1.1 香农熵的物理极限1.2 量子退相干的时间屏障二、数学根基:形式系统的自指困境2.1 哥德尔不完备定理的现代诠释三、概念解构:AGI觉醒假说的认知陷阱3.1 术语混淆的迷雾3.2 拟人化谬误的认知根源四、意识…...
SpringMVC的基本使用
controller标记一个类是控制器类 RequestMapping 进行路由映射可以是类也可以是方法,路由的/可以不加,但建议加上 1)简单的映射返回一个hello RequestMapping("/m1")public String m1() { return "hello";} 2&#x…...
【漫话机器学习系列】103.学习曲线(Learning Curve)
学习曲线(Learning Curve)详解 1. 什么是学习曲线? 学习曲线(Learning Curve)是机器学习和深度学习领域中用于评估模型性能随训练过程变化的图示。它通常用于分析模型的学习能力、是否存在过拟合或欠拟合等问题。 从…...
ubuntu-24.04.1-desktop 中安装 QT6.7
ubuntu-24.04.1-desktop 中安装 QT6.7 1 环境准备1.1 安装 GCC 和必要的开发包:1.2 Xshell 连接 Ubuntu2 安装 Qt 和 Qt Creator:2.1 下载在线安装器2.2 在虚拟机中为文件添加可执行权限2.3 配置镜像地址运行安装器2.4 错误:libxcb-xinerama.so.0: cannot open shared objec…...
MQTT实现智能家居------2、写MQTT程序的思路
举个最简单的例子: 手机------服务器-------家具 我们这里只看手机和家具的客户端: 手机:1)需要连接服务器 2)需要发布指令给服务器到家里的家具 3)接受来自于家里家具的异常状况 4)保持心…...
【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】
文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-1微调2.2.3.2 zero-2微调2.2.3.3 zero-3微调2.2.3.4 单卡Lora微调 2.2.4 实验2.2.4.1 实验1:多GPU微调-zero12.2.4.2 实验2:…...
DeepSeek 从入门到精通:全面掌握 DeepSeek 的核心功能与应用
引言 DeepSeek 是一款功能强大的工具(或平台/框架,具体根据实际定义),广泛应用于数据分析、人工智能、自动化任务等领域。无论你是初学者还是资深开发者,掌握 DeepSeek 的核心功能和应用场景都将为你的工作和学习带来…...
“国补”带火手机换新,出售旧手机应如何保护个人信息安全
在“国补”政策的推动下,手机换新热潮正席卷而来。“国补”以其诱人的补贴力度,成功激发了消费者更换手机的热情。无论是渴望体验最新技术的科技爱好者,还是对旧手机性能不满的普通用户,都纷纷投身到这场手机换新的浪潮之中。 随着大量消费者参与手机换新,二手手机市场迎来…...
驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线
一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…...
Windows使用docker部署fastgpt出现的一些问题
文章目录 Windows使用docker部署FastGPT出现的一些问题1.docker部署pg一直重启的问题2.重启MongoDB之后一直出现“Waiting for MongoDB to start...”3.oneapi启动不了failed to get gpt-3.5-turbo token encoder Windows使用docker部署FastGPT出现的一些问题 1.docker部署pg一…...
六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战
欢迎来到编程星辰海的博客讲解 目录 一、语义化标签的核心价值 1.1 什么是语义化? 1.2 核心优势 二、语义标签详解与使用场景 2.1 布局容器标签 2.2 内容组织标签 三、博客结构搭建实战 3.1 完整HTML结构 3.2 核心结构解析 3.3 实现效果说明 四、学习要点…...
Oracle中补全时间的处理
在实际数据处理的过程中,存在日期不连续的问题,可能会导致数据传到前后端出现异常,为了避免这种问题,通常会从数据端进行日期不全的处理: 以下为补全年份的案例: with x as (select 开始年份 (…...
PHP课程预约小程序源码
📱 课程预约小程序:为您专属定制的便捷预约新体验 在这个快节奏的时代,我们深知每一位瑜伽爱好者、普拉提追随者以及培训机构管理者对高效、便捷服务的迫切需求。因此,我们匠心独运,推出了一款基于PHPUniApp框架开发的…...
(200): error: #29: expected an expression error: #40: expected an identifier
这是因为你乱加define导致你的define与变量名重复就会出现,他找不到错误只会抱着两个错...
一文讲解Redis中的常用命令
①、操作字符串的命令有: SET key value:设置键 key 的值为 value。GET key:获取键 key 的值。DEL key:删除键 key。INCR key:将键 key 存储的数值增一。DECR key:将键 key 存储的数值减一。 ②、操作列表…...
智能交通系统(Intelligent Transportation Systems):智慧城市中的交通革新
智能交通系统(Intelligent Transportation Systems, ITS)是利用先进的信息技术、通信技术、传感技术、计算机技术以及自动化技术等,来提升交通系统效率和安全性的一种交通管理方式。ITS通过收集和分析交通数据,智能化地调度、控制…...
Node.js 登录鉴权
目录 Session express-session 配置 express-session 函数 ts 要配置声明文件 express-session.d.ts express-session 使用 express-session 带角色 Token 什么是 JWT token jsonwebtoken 使用 jsonwebtoken 带角色 Session express 使用 express-session 管理会话&…...
EPSON L3118彩色喷墨打印机灯全闪故障维修一例
一台EPSON L3118彩色喷墨打印机,故障时开机灯全闪烁,一般来说这种故障问题都不太大,要么就是打印机内部卡纸了,要么就是传感器故障,一般情况下卡纸的问题比较多… …; 但是遇到一用户又菜又爱玩,…...
在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键
在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键,主要涉及到两个方面:确保 F1 键作为标准功能键工作 和 在 Snipaste 中设置 F1 为快捷键。 因为 Mac 默认情况下,F1-F12 键通常用作控制屏幕亮度、音量等系统功能的快捷键…...
基于AT89C51单片机的教室智能照明控制系统
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90419908?spm1001.2014.3001.5501 C16 部分参考设计如下: 摘 要 本项目的智能教室灯光控制系统通过合理的软硬件设计,有效地提升了教室…...
JavaSE学习笔记25-反射(reflection)
反射 在Java中,反射(Reflection) 是一种强大的机制,允许程序在运行时检查和操作类、方法、字段等信息。通过反射,可以动态地创建对象、调用方法、访问字段,甚至修改私有成员。反射的核心类是 java.lang.re…...
ctf网络安全题库 ctf网络安全大赛答案
此题解仅为部分题解,包括: 【RE】:①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…...
旋转位置编码(ROPE)详解:从Transformer到现代前沿
旋转位置编码(ROPE)详解:从Transformer到现代前沿 标签:NLP, Transformer, 位置编码, ROPE, 深度学习, 机器学习 摘要:本文详细介绍了旋转位置编码(ROPE)在Transformer模型中的应用࿰…...
ROS2机器人开发--服务通信与参数通信
服务通信与参数通信 在 ROS 2 中,服务(Services)通信和参数(Parameters)通信是两种重要的通信机制。服务是基于请求和响应的双向通信机制。参数用于管理节点的设置,并且参数通信是基于服务通信实现的。 1 …...
安全运维,等保测试常见解决问题。
1. 未配置口令复杂度策略。 # 配置密码安全策略 # vi /etc/pam.d/system-auth # local_users_only 只允许本机用户。 # retry 3 最多重复尝试3次。 # minlen12 最小长度为12个字符。 # dcredit-1 至少需要1个数字字符。 # ucredit-1 至少需要1个大…...
【数据标准】数据标准化是数据治理的基础
导读:数据标准化是数据治理的基石,它通过统一数据格式、编码、命名与语义等,全方位提升数据质量,确保准确性、完整性与一致性,从源头上杜绝错误与冲突。这不仅打破部门及系统间的数据壁垒,极大促进数据共享…...