stl_list的模拟实现
文章目录
- stl_list的模拟实现
- 迭代器的介绍以及分类
- stl_list的基本接口介绍
- stl_list的模拟实现
- 结点类
- 迭代器类
- 基本迭代器操作
- 链表类
- 链表基本操作
- 结语
我们今天又见面啦,给生活加点impetus!!开启今天的编程之路
作者:٩( ‘ω’ )و260
我的专栏:C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!
stl_list的模拟实现
迭代器的介绍以及分类
在c++中,已经说明了迭代器的作用是用来遍历容器,我们发现每一次写代码是迭代器都是iterator,表面上看这些迭代器都是一样的,但是从底层来看,真的是一样的吗?答案是否定的。
迭代器分为单向迭代器,双向迭代器,随机迭代器
其实这三个迭代器很想套娃,那么有什么区别呢?
单向迭代器支持++,双向迭代器支持++/–,随机迭代器支持++/–/+/-。
但是他们都支持引用,等于,不等于等操作符
不同迭代器适配不同的容器(对迭代器的调整方式):比如单向迭代器适配于单链表等只能单向遍历的数据结构,双向迭代器适配于那些可以双向遍历的双向链表等的数据结构,随机迭代器适配std::vector、std::deque 和数组,适配于可以随机访问元素的数据结构
其实在单向迭代器中我们还能够来分类,分为输入和输出,看图示:
其实,我们在看一个一个接口支持迭代器操作的时候,我们就能够得到需要传递什么迭代器,比如:
我们来想一下,为什么迭代器不能支持+/-操作呢?
list的底层是链表,所以我们只能通过地址找到下一个位置的地址,如果要+5的话,本质上就是实现总共++5次,这样效率太低了,所以不如不实现。
总结:
由于容器的底层结构不同,有的是数组,有的是结点,导致我们传递的迭代器的种类不同,不同的迭代器有着不同的作用,适配不同的容器
迭代器介绍
stl_list的基本接口介绍
在string中,已经对一些接口进行了介绍,我们主要来看我们没有见过的接口:
sort:为什么算法库里面有sort,但是这里还自己实现sort呢?
我们先来看算法库中的sort:
但是先前已经说过,list的迭代器只能够是双向的,只支持++和–,不支持+和-,因为迭代器类型不支持算法库中的sort,所以我们饿只能够容器中自己包含了。
unique:去除链表中的重复元素,但是条件是链表需要有序,因为本质上遍历的时候两个指针是挨着一起的。
remove:给定一个x值,把链表中等于这个值的结点给删掉
erase删除迭代器以及指向的值,一定涉及迭代器失效。
splice(粘接):条件:必须是同类型的链表才能使用splice
因为上面的接口用的不是很多,我们这里不再详细叙述
总结:迭代器传递类型一定要与容器匹配
数据量大的时候不要用list容器来排序,效率特别低,应该使用vector来排序,本质还是底层结构不一样,支持的迭代器操作不一样导致的效率差别
补充知识点:有无递归的代码会影响效率,在Debug版本下函数栈帧的创建与销毁的代价大于Release版本
stl_list的模拟实现
首先明白,在链表中,指针不是迭代器,因为++迭代器,与++指针的效果不一样,只有在连续的地址中,指针可以等价为迭代器,所以在list类中,我们需要使用迭代器来封装指针,来达到指针向后遍历的效果!!
可能你会问,那我们为什么要封装指针,为啥就不能直接使用指针呢?
没办法,因为在容器中很多接口都是使用迭代器进行的,所以我们必须封装指针为迭代器。所以我们不能向实现vector和string一样,写typedef指针为迭代器。
这里为什么需要定义三个类?
因为结点和链表肯定不能够等价,不能够合到一起,结点是一小个部分,只能控制这一个结点,而链表肯定需要控制整个链表,实现迭代器还是因为指针大部分算法无法完成。
结点类
结点类,顾名思义,只能够控制一个结点,那么一个结点需要控制哪些呢?肯定是成员变量以及构造函数了:
template<class T>//定义模版,因为结点中数值域存储的数据类型可能各不相同
struct list_node{
public:list_node(const T& data=T())//使用匿名对象,没有实参的话,使用匿名对象调用构造函数赋值给data:_next(nullptr),_prev(nullptr),_data(data){}
private:list_node* _next;list_node*_prev;int _data;
};
为什么这里我使用struct,而非class,我们前面提到,使用一个容器,我们不能暴露他的底层。定义为公有不怕暴露吗?实则很难暴露,虽然为公有,但是每个编译器底层实现容器都是不同的,就算能够访问,但是可能每个变量名称都不同,我们敢去访问吗?
所以,这里我们直接大胆一点,设置为公有即可!!
迭代器类
我们让迭代器的成员函数是一个结点,主要是为了记录此时迭代器已经遍历到哪一个位置了。而且迭代器我们一直都是需要的,所以里面的操作都要设置为公有
基本迭代器操作
定义迭代器结构:
template<class T,class Ref,class Ptr>
struct list_iterator{typedef list_iterator<T,Ref,Ptr> self;//为了书写方便一些typedef list_node<T> Node;//重定义是为了方便一些Node* _node;//成员函数,因为结点都是以指针的形式保存的,所以这里设置为指针
};
为什么我这里设置了三个模版参数,我们这里等下再来解答
那么跌代器里面的基本操作有哪些呢?
++/–(调整结点,前置还是后置),*(获取结点中的数据,涉及这个对象是否可以修改,普通的传引用返回还是要有const修饰)->(获取成员变量中的数据,返会的成员变量是否可以修改,加不加const修饰),迭代器是否相等/不相等。
我们首先来实现这个类的构造函数:
list_iterator(Node* node):_node(node);//构造函数
实现获取成员函数中的数据,重载*操作符:
T& operator*()
{return _node->_data;
}
此时数据是可读可写的,那我们如果让数据只可读呢?
const T& operator*()
{return _node->_data;
}
但是又有一个问题,这两个函数构成函数重载吗,肯定不构成,因为单单凭借返回值,是不能够实现函数重载的,那我们怎么要让这两个成员函数同时存在呢?第一:实现两个迭代器类,因为不同作用域下的同名函数不受影响,但是这样太麻烦了,第二:我们发现,是不是只有类型不一样,,是的。所以我们直接再定义一个模版Ref,这个就是模版的作用。
来看最终代码:
Ref operator*()
{return _node->_data;
}
来看->操作符:
我们需要返回成员变量中的指针,为什么呢?因为可能list容器的数据是另一个容器,另一个容器的成员保存着需要访问的数据,需要返回指针,我们才能接着访问
T* operator->()
{return &_node->_data;
}
如果我们返回的指针不想让他被修改呢?
返回const修饰的结果:
const T* operator->()
{return &_node->_data;
}
还是同样的问题,所以我们这里实现了创建了第三个模版参数Ptr,最终结果:
Ptr operator->()
{return &_node->_data;
}
对比一下* 和 ->的1区别:操作符我只是想要获取其中的数据,但是->时,成员可能为自定义类型,我需要获取这个成员变量(自定义类型)的数据
都是实现了模版参数来看返回值是否是可以修改的
可以转化为:
typedef list_iterator<T,T&,T>可修改的迭代器类型
typedef list_const_iterator<T,const T&,const T*>不可修改的迭代器类型
实现迭代器++,++之后我们需要返回一个新的迭代器指向新的位置:
分为前置++和后置++
self& operator++()//前置++
{_node=_node->_next;return *this;
}
self operator++(int)//后置++
{self tmp(*this);_node=_node->_next;return tmp;
}
实现迭代器–,–之后我们需要返回一个新的迭代器指向新的位置:
分为前置–和后置–
self& operator++()//前置++
{_node=_node->_prev;return *this;
}
self& operator++(int)//后置++
{self tmp(*this);_node=_node->_prev;return tmp;
}
判断跌代器是否相等,还是不相等
//l1!=l2
bool operator !=(const self<)const
{return _node!=lt._node;
}
bool operator ==(const self<)const
{return _node==lt._node;
}
到这里,我们完成了list类中所有迭代器的操作
链表类
我们主要的操作都在这里面实现,我们通过链表类来对整个链表进行数据的增删查改等操作,前面的两个类主要是为了这一个类来进行铺垫
链表基本操作
先来定义链表结构,我们先来思考成员变量,链表主要是由结点构成,所以成员变量肯定包含结点,而且,双向链表一定会有头结点。此外,我们还添加了了一个成员变量size,用来统计结点的个数。因为我们双向链表中是有一个头结点,哨兵位,所以初始化的方式有点不同
在链表中,我们会实现返回首尾的迭代器(分为指向内容是否可修改,const是否修饰),空初始化(初始化头结点),清除,销毁,插入(头插,尾插),删除(头删,尾删),拷贝构造
来看结构:
template<class T>
class list{typedef list_node<T> Node;
pubilc:typedef list_iterator<T,T&,T*> iterator;typedef list_iterator<T,const T&,const T*> const_iterator;
private:Node*_head;int _size = 0;
}
这里我们需要隐藏掉我们的底层结构,不能够轻易给别人访问到。
我们来实现空初始化,主要是实现初始化头结点,为什么要单拎出来呢?
因为构造,拷贝构造,清除等操作都与空初始化有关:
void emptyinit()
{Node* _head=new Node;_head->next=head;_head->prev=head;_size=0;
}
我们来实现构造函数:
我们可以使用普通的构造,也可以使用其他类来构造
其他类来构造的话就能够实现{}花括号来整体传参,不用再来一个一个的push_back数据了。因为多参数隐式类型转换构造需要使用{}给成员变量括起来。
list()
{emptyinit();//直接利用空初始化完成即可
}
list(initializer_list<T> il)//手动创建空间以及首尾迭代器,所以我们使用范围for
{for(auto& e:il){push_back(e);}
}
实现迭代器(普通迭代器与const修饰的迭代器)
首迭代器其实就是_head的下一个结点,将这个结点作为迭代器的成员变量即可。
尾迭代器其实就是_head的前一个结点,将这个结点作为迭代器的成员变量即可。
迭代器分为可修改版本以及不可修改版本
iterator begin()
{return iterator(_head->_next);
}
const_iterator begin()const
{return iterator(_head->_next);
}
iterator begin()
{return iterator(_head->_prev);
}
const_iterator begin()const
{return iterator(_head->prev);
}
思考:为什么下方迭代器while遍历的时候只能写!=,但是在string,vector中可以写<还能写!=
因为底层结构,因为数组连续,写<可以根据地址大小来比较出结果,淡然底层是数组的时候也可以写!=,但是在底层为链表的时候,只能写!=,因为每一个结点的地址没有明确的大小关系
随后我们再来实现数据的插入以及删除
先来看数据的插入操作,这里默认的是在数据的前面进行插入一个结点的操作。我们需要先利用这个数据构造一个newnode的结点,改变指向,完成插入。
void insert(iterator pos,const T&x)
{Node*newnode = new Node(x);//创建新的结点//列出受影响的几个结点Node*cur=pos._node;Node*prev=cur->_prev;//改变指向prev->next=newnode;newnode->_prev=prev;cur->_prev=newnode;newndoe->_next=cur;++_size;
}
思考:list的insert操作会不会涉及到迭代器失效呢?
答案是否定的,因为这里无论如何,迭代器都不可能变成野迭代器。不同于string,vector,因为涉及扩容,所以insert迭代器可能会失效
总结:insert迭代器失效问题:容器底层的数组的可能面临迭代器失效问题,看是否发生扩容。但是底层为链表迭代器不可能失效
再来看链表的删除操作,删除链表,指向改变受到影响结点的指针就好了。注意:erase操作是不能删除头结点的,必须析构的时候再去删除头结点
iterator erase(iterator pos)
{assert(pos!=end());Node*cur=pos._node;Node*prev=cur->_prev;Node*next=cur->_next;//改变指向prev->_next=next;next->_prev=prev;delete cur;cur=nullptr;//return iterator(next);//调用拷贝构造return next;//隐式类型转换
}
思考:list的erase操作是否会迭代器失效问题?
答案是肯定的,因为我删除了这个结点,结点被标记,造成结点迭代器失效,所以我需要返回下一个位置的迭代器。
总结:几乎所有的容器的erase都会造成迭代器失效问题,erase都必须返回下一个位置的迭代器,并需要重新赋值给迭代器,随后这个迭代器才能够使用。
再来实现清理数据操作:
void clear()
{iterator it=begin();while(it!=end()){it=erase(it);it++;}
}
接下来我们来实现析构,因为有资源,析构必须手动实现,否则内存泄漏,但是在析构之前我们需要先先清理掉里面的数据
~list()
{clear();delete _head;_head=nullptr;
}
我们再来看数据的尾插头插,尾删头删的操作:
因为我们已经实现了insert以及erase,这里我们就可以直接来复用了:
直接看代码:
void push_back(const T& x){//尾插insert(end(), x);}void push_front(const T& x){//头插insert(begin(), x);}void pop_front(){//头删erase(begin());}void pop_back(){//尾删//erase(end()._node->prev);//或者下面这种方法也行的erase(--end());}
注意:begin()的返回值是_head的下一个结点,但是end()返回值就是_head,因为左闭右开。
接下来实现拷贝构造,编译器默认生成的是浅拷贝:
思路:先空初始化,随后调用push_back即可
list(const list<T>& lt)//const对象,肯定会调用const的迭代器
{emptyinit();//先空初始化for(auto& e:lt){push_back(e);}
}}
我们再来实现赋值重载,我们来写现代写法,赋值重载肯定会调用拷贝构造,索性我这里进行传值调用:
因为库中的swap交换内置类型效果太差了,所以只适合交换内置类型
void swap(list<T> lt)
{std::swap(_head,lt._head);std::swap(_size,it._size);
}
//l1=l2
list<T>& operator=(list<T> lt)
{swap(lt);return *this;
}
最后我们再来总结一下:
- -> .这三个操作符:
1:.操作符可以访问对象(自定义类型),不能操作内置类型
2:操作符能够解引用指针,可以访问内置类型的指针,或者自定义类型的指针
3:->操作符一般访问的都是自定义类型,访问内置类型很不常见
但是如果是通过上面的三个操作数去访问自定义类型的成员变量,都是必须要去重载的
总结: ->和个操作符不管是内置类型还是自定义类型,是都可以操作的,.点操作符不可以操作指针。.点操作符可以操作对象,即自定义类型的对象,剩余两个不能够直接操作对象。其实,可以理解为->操作符是基于点操作符和解引用操作符的,是先解引用,再来进行点操作符的
结语
感谢大家阅读我的博客,感谢大家的支持,不足之处欢迎留言指正!
生如蝼蚁,当立鸿鹄之志,冥如薄纸,应有不屈之心,每段风雨之后,眼前是翱翔于游的天水一色,走出荆棘,前面是铺满鲜花的康庄大道,登上山顶,脚下便是积翠如云的空山蒙色。
相关文章:
stl_list的模拟实现
文章目录 stl_list的模拟实现迭代器的介绍以及分类stl_list的基本接口介绍stl_list的模拟实现结点类迭代器类基本迭代器操作 链表类链表基本操作 结语 我们今天又见面啦,给生活加点impetus!!开启今天的编程之路 作者:٩( ‘ω’ …...
【蓝桥杯】十五届省赛B组c++
目录 前言 握手问题 分析 排列组合写法 枚举 小球反弹 分析 代码 好数 分析 代码 R 格式 分析 代码 宝石组合 分析 代码 数字接龙 分析 代码 拔河 分析 代码 总结 前言 主播这两天做了一套蓝桥杯的省赛题目(切实感受到了自己有多菜&#x…...
变分自编码器(VAE)概念解析与用法实例:根据原图像生成新图像
目录 1. 前言 2. VAE原理 2.1 什么是VAE? 2.2 编码器(Encoder) 2.3 重参数化技巧(Reparameterization Trick) 2.4 解码器(Decoder) 2.5 损失函数 3. Pytorch实现:根据原图像…...
AI随身翻译设备:从翻译工具到智能生活伴侣
文章目录 AI随身翻译设备的核心功能1. 实时翻译2. 翻译策略3. 翻译流程4. 输出格式 二、AI随身翻译设备的扩展功能1. 语言学习助手2. 旅行助手3. 商务助手4. 教育助手5. 健康助手6. 社交助手7. 技术助手8. 生活助手9. 娱乐助手10. 应急助手 三、总结四、未来发展趋势࿰…...
基于大模型的重症肌无力的全周期手术管理技术方案
目录 技术方案文档1. 数据预处理模块2. 多任务预测模型架构3. 动态风险预测引擎4. 手术方案优化系统5. 技术验证模块6. 系统集成架构7. 核心算法清单8. 关键流程图详述实施路线图技术方案文档 1. 数据预处理模块 流程图 [输入原始数据] → [联邦学习节点数据对齐] → [多模态特…...
Linux常用命令详解:从基础到进阶
目录 一、引言 二、文件处理相关命令 (一)grep指令 (二)zip/unzip指令 编辑 (三)tar指令 (四)find指令 三、系统管理相关命令 (一)shutdown指…...
【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具
【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具 资源简介 DeepSeek谷歌版1.1.5是目前全球领先的免费AI助手,性能超越国内主流AI产品,提供类似GPT-4的智能体验。 版本信息 最新版本:1.1.5(2024最新版)应用…...
JWT认证服务
JSON Web Token(JWT)是一种用于在网络应用间安全地传递信息的紧凑、自包含的方式。以下是关于 JWT 认证服务器更详细的介绍,包括其意义、作用、工作原理、组成部分、时效性相关内容、搭建条件以及代码案例。 JWT 的意义与作用 意义…...
Raft算法
Raft算法用于保证分布式环境下多节点数据的一致性。 原理 Raft算法的主要思想是一个 选主(leader selection) 的算法思想,集群种每个节点都有可能成为三种角色。 三种角色 leader 对客户端通信的入口,对内数据同步的发起者,一个集群通常只…...
Kotlin 类委托深入解析:以 MMKV 为例看委托机制在 Android 中的巧妙应用
Kotlin 中的类委托(class delegation)是一个非常实用的特性,它允许我们将接口的实现交给另一个对象,从而简化代码,提升复用性和灵活性。本文将通过简单的 Demo 介绍类委托的基本用法,并以 Android 中的 MMK…...
2025年渗透测试面试题总结-某一线实验室实习扩展(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 某一线实验室实习扩展 一、流量分析深度实践 1. FTP反弹定时确认包流量检测 1.1 攻击原理与特征 1.…...
2025大唐杯仿真3——移动性管理
仅仅是1-2之间的信息交互...
云原生与微服务的关系
云原生(Cloud Native)和微服务(Microservices)是现代软件开发和部署中密切相关的两个概念,它们共同推动了应用程序的架构设计、开发模式和运维方式的变革。以下是两者的关系及核心要点: 定义与核心概念 云原…...
【百日精通JAVA | SQL篇 | 第三篇】 MYSQL增删改查
SQL得最核心就是增删改查 一个后端开发,在工作中,最常见的场景就是CRUD。 插入数据 insert into student values (1,zhangsan); 指定列插入数据 同时多个列明之间使用逗号,来分割 insert into student (name) values (zhaoliu); 这个黑框…...
【leetcode】记录与查找:哈希表的题型分析
前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…...
如何在 Windows 10 上安装 PyGame
PyGame 是 Python 编程语言中的一组跨平台模块,这意味着您可以在任何操作系统上安装它,这篇文章告诉您如何在 Windows 10 上安装 PyGame。 如何在 Windows 10 上安装 PyGame? PyGame 依赖于 Python,这意味着您必须在安装 PyGame …...
LVGL修改标签文本,GUI Guider的ui不生效
一.问题背景 笔者最近在学习LVGL框架,同时准备使用该框架作为课程设计的一部分,于是需要从静态显示进阶到动态显示以及事件交互。一方面由于笔者是初次接触LVGL,对它并不熟悉,另一方面由于其网络上的针对性具体资料太少&a…...
制造装备物联及生产管理ERP系统设计与实现(代码+数据库+LW)
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装制造装备物联及生产管理ERP系统软件来发挥其高效地信息处理…...
PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限
如果你用Mac管理照片,大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启,想合并照片得手动导出导入,重复文件更是无处可逃…… 直到我发现了 PowerPhotos,这款专为Mac设计的照片库管理…...
软件工程面试题(三十)
将ISO8859-1字符串转成GB2312编码,语句为? String snew String(text.getBytes(“iso8859-1”),”gb2312”). 说出你用过的J2EE标准的WEB框架和他们之间的比较? 答:用过的J2EE标准主要有:JSP&Servlet、JDBC、JNDI…...
Java面试黄金宝典35
1. A 和 B 两个表做等值连接 (Inner join) 怎么优化 索引优化:在连接字段上创建索引,让数据库在进行等值连接时,能够快速定位匹配的记录,减少全表扫描的开销。例如,若 A 表和 B 表通过 id 字段进行连接,可在…...
openssl-1.0.1e.tar.gz编译安装步骤
下载与验证 openssl-1.0.1e.tar.gz下载链接:https://pan.quark.cn/s/d682551565e8 校验文件完整性(示例): # 检查 SHA256 哈希值 sha256sum openssl-1.0.1e.tar.gz # 对比官方发布的哈希值(需从 OpenSSL 官网获取&a…...
供应链业务-供应链全局观(二)
概述 我们在供应链业务知识分享的第一篇供应链业务-供应链全局观(一)中大致聊了以下三点: 1、供应链的本质:环环相扣的增值网络。供应链是从供应商的供应商到客户的客户之间,通过采购、生产、运输、仓储、销售等环节…...
在 Flutter 中Navigator.push 用于实现页面之间的导航
在 Flutter 中,Navigator.push 是一个非常重要的方法,用于实现页面之间的导航。通过 Navigator.push,你可以将一个新的页面(路由)推送到导航栈中,从而显示新的内容。 以下是一个详细的教程,帮助…...
安永启用AI驱动SAP云ERP系统
安永(EY)宣布与 SAP 和微软展开战略合作,正式启动将其内部业务系统升级为基于 SAP S/4HANA Cloud 私有版的现代化 ERP 系统,并部署在 Microsoft Azure 云平台上。此次转型不仅涉及系统更新,还将通过引入人工智能&#…...
Augment Code:下一代AI编程助手,能否超越GitHub Copilot?
1. 背景介绍 近日,AI编程助手公司 Augment Code 宣布完成 2.27亿美元B轮融资,估值接近 9.77亿美元,距离独角兽企业仅一步之遥。本轮融资由 Sutter Hill Ventures、Index Ventures、Innovation Endeavors、Lightspeed Venture Partners 和 Me…...
图像处理之《直方图规定化和低失真数据隐藏的可逆对比度增强》论文阅读
全文目录 一、文章摘要二、直方图规定化三、提出的方法A.峰值和零点的选择B.数据序列扩展C. V L D E \mathrm{VLD_E} VLDE: 带有扩展的极低失真D.提出的RCE-HS方案四、实现细节五、汇报PPT一、文章摘要 本文研究可逆对比度增强(RCE)。图像增强是通过直方图规定化实现的,直方…...
状态模式~
状态模式 在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同状态下也将具有不同的行为. 状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式就是用于解决系统…...
Latex入门之超详细的Latex环境配置教程
最近在学习Latex,顺便给大家分享一下Latex环境配置的心得。Latex作为一种高质量的排版系统,广泛应用于学术论文、书籍和报告的排版中。对于初学者来说,配置Latex环境可能是个挑战,但只要按照本文的步骤来,其实并不难。…...
[WUSTCTF2020]CV Maker1
进来是个华丽的界面,我们先跟随这个网页创造一个用户 发现了一个上传端口,尝试上传一个php文件并抓包 直接上传进不去,加个GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 传入 并且报告了 上传路径,然后使用蚁剑连接...
第1课:React开发环境搭建与第一个组件
第1课:React开发环境搭建与第一个组件 学习目标 搭建React开发环境创建第一个React项目了解项目基本结构编写并运行第一个React组件 一、环境准备 1. 安装Node.js React开发需要Node.js环境,它包含了npm(Node Package Manager࿰…...
go垃圾回收机制
Go语言的垃圾回收(GC)机制旨在高效管理内存,同时最小化对程序性能的影响。其核心设计结合了并发标记清除、三色标记法和写屏障技术,显著减少了停顿时间(Stop-The-World, STW)。以下是Go垃圾回收机制的关键特…...
【GPT入门】第 34 课:深度剖析 ReAct Agent 工作原理及代码实现
【GPT入门】第 34 课:深度剖析 ReAct Agent 工作原理及代码实现 1. React Agent概述2. React Agent工作原理、关键特点、应用场景3. langchain的ReAct Agent代码实现3.1 Openai1.x 代码实现3.2 Openai 0.x的实现3.3 新旧版API异同比较 1. React Agent概述 定义与基…...
MySQL介绍及使用
1. 安装、启动、配置 MySQL 1. 安装 MySQL 更新软件包索引 sudo apt update 安装 MySQL 服务器 sudo apt install mysql-server 安装过程中可能会提示你设置 root 用户密码。如果没有提示,可以跳过,后续可以手动设置。 2. 配置 MySQL 运行安全脚本…...
九、重学C++—类和函数
上一章节: 八、重学C—动态多态(运行期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147004745?spm1001.2014.3001.5502 本章节代码: cpp/cppClassAndFunc.cpp CuiQingCheng/cppstudy - 码云 - 开源中国…...
C++·包装器
目录 function 包装各种可调用对象 包装类成员函数 应用举例 bind 一般形式 arg_list 调整参数顺序 调整参数个数(绑死) 应用举例 小知识 function 包含在<functional>头文件中,是一个类模版,但本质还是仿函数。…...
Linux动态监控进程利器:top命令详解
动态监控进程利器:top命令详解 在Linux系统的日常管理中,实时监控进程状态和资源使用情况是一项至关重要的任务。top命令作为Linux系统自带的强大工具,以其动态更新的特性,成为了系统管理员和开发者的得力助手。本文将全面解析to…...
家庭路由器wifi设置LAN2LAN和LAN2WAN
一、LAN2LAN 方式:桥接模式,主路由器的LAN口接入子路由器的LAN口 子路由器先重置登录密码(知道密码可以不重置),登录后台 1、设置为动态IP模式 2、找到LAN口设置 1)ip设置和主路由器在一个网段上&#…...
Python实现NOA星雀优化算法优化LightGBM分类模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 在机器学习领域,分类问题是许多实际应用场景的核心任务之一,例如信用评估、…...
面试顺序优化:基于Matlab的高效决策方案
内容摘要 本文围绕面试顺序问题,通过建立数学模型并利用Matlab编程求解,寻找使面试总时长最短的面试顺序安排。详细介绍问题分析、模型构建及Matlab代码实现过程,为类似的时间优化问题提供参考,助力提升流程效率。 关键词&#x…...
【暑期实习之战】2024年美团秋招技术岗第一批笔试(练习)
选择题 6. 在MySQL中可以用来执行预处理语句的是() A execute B prepare C deallocate D using prepare:用于预编译SQL语句(为执行做准备),但并非执行动作本身。execute:专门用于执行已通过 PREPARE 预处理的语句,是运行预编译查询的关键步骤。✔deallocate prepare:…...
VLAN详解
VLAN(虚拟局域网)详解 1. 基本概念 VLAN(Virtual Local Area Network)是一种通过逻辑划分而非物理连接实现的局域网技术,允许在同一物理网络基础设施上创建多个独立的广播域。 2. 核心功能 功能说明广播域隔离不同V…...
[leetcode]1786. 从第一个节点出发到最后一个节点的受限路径数(Dijkstra+记忆化搜索/dp)
题目链接 题意 给定一个无向连通图,edges{u,v,w} 表示 u u u和 v v v之间有一条无向边,边权为 w w w n n n个点 [ 1 , n ] [1,n] [1,n] 每个点到 n n n的最短路为 d i s [ i ] dis[i] dis[i] 定义受限路径: 从起点 1 1 1到 n n n,路径上的…...
Ubuntu挂载HDD迁移存储PostgreSQL数据
关联博客:windows通用网线连接ubuntu实现ssh登录、桌面控制、文件共享 背景: 在个人ubuntu机器上安装了pgsql,新建了一张表插入了2000w数据用于模拟大批量数据分页查询用,但是发现查询也不慢(在公司测试环境查询1700…...
设计模式简述(五)建造者模式
建造者模式 描述基本要素协调类使用 描述 建造者模式属于创造型设计模式。 通常用于构建一系列复杂对象,这些对象有一定的共性。 我们可以通过不同的建造者,组装不同的对象 与工厂模式的区别,建造者模式更侧重与基于基础构件组装而非直接创…...
ARXML文件解析-2
目录 1 摘要2 常见ARXML文件注意事项以及常见问题2.1 注意事项2.2 常见问题2.3 答疑 3 ARXML解读/编辑指南3.1 解读ARXML文件的步骤3.2 编辑ARXML文件的方法3.3 验证与调试 4 总结 1 摘要 本文主要对ARXML文件的注意事项、常见问题以及解读与编辑进行详细介绍。 上文回顾&…...
Docker设置代理
目录 前言创建代理文件重载守护进程并重启Docker检查代理验证 前言 拉取flowable/flowable-ui失败,用DaoCloud源也没拉下来,不知道是不是没同步。索性想用代理拉镜像。在此记录一下。 创建代理文件 创建docker代理配置 sudo mkdir -p /etc/systemd/s…...
ASP.NET Core Web API 参数传递方式
文章目录 前言一、参数传递方式路由参数(Route Parameters)查询字符串参数(Query String Parameters)请求体参数(Request Body)表单数据(Form Data)请求头参数(Header Pa…...
火语言RPA--PgSQL-导入数据表格
【组件功能】:导入特定的表格数据到包含同样字段的数据表 将表格对象数据通过数据库操作对象导入到指定数据库。 配置预览 配置说明 源表格 表格来源有“来自表格对象”和“来自表达式”2种,表达式支持DataTable类型变量。 对象 对应来自表格对象&…...
Spring Cloud 网关及配置管理教学
一、课程目标 深入理解 Spring Cloud 中网关和配置管理的核心概念、原理及应用场景。熟练掌握 Spring Cloud Gateway 的配置与开发,能够实现请求路由、登录校验、用户信息传递等功能。学会使用 Nacos 进行配置管理,包括共享配置、配置热更新和动态路由的…...