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

STL中list的模拟

这里写目录标题

  • list 的节点 —— ListNode
  • list 的 “导览员” —— ListIterator
  • list 的核心 —— list 类
    • 构造函数
    • 迭代器相关操作
    • 容量相关操作
  • 结尾

在 C++ 的 STL(标准模板库)中,list 是一个十分重要的容器,它就像一个灵活的弹簧,可以在任意位置快速地插入和删除元素。今天,就让我们一起走进 list 的世界,去探索它的奥秘。

list 的节点 —— ListNode

    template<class T>struct ListNode{ListNode(const T& val = T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val;};

list 的基础是节点,就像一串项链上的珠子。代码中的 ListNode 就承载着这样的角色。每个节点都有一个前驱指针 _pPre、一个后继指针 _pNext 和一个存储数据的 _val。它们就像是珠子的连接线,将一个个数据串联起来,构成了 list 的主体。当我们创建一个节点时,它就像一颗独立的珠子,等待被加入到项链中。

list 的 “导览员” —— ListIterator

 //List的迭代器类template<class T, class Ref, class Ptr>struct ListIterator{typedef ListNode<T>* PNode;typedef ListIterator<T, Ref, Ptr> Self;//成员函数ListIterator(PNode pNode = nullptr):_pNode(pNode){}ListIterator(const Self& l)//怎么实现拷贝{_pNode = l._pNode;}T& operator*(){return _pNode->_val;}//T* operator->()//存疑//{//    return  &_pNode->_val;//}Self& operator++(){_pNode= _pNode->_pNext;return *this;}Self operator++(int){Self tmp(*this);_pNode = _pNode->_pNext;return tmp;}Self& operator--(){_pNode = _pNode->_pPre;return *this;}Self& operator--(int){Self tmp(*this);_pNode = _pNode->_pPre;return tmp;}bool operator!=(const Self& l){return _pNode != l._pNode;}bool operator==(const Self& l){return _pNode == l._pNode;}//成员对象PNode _pNode;};

有了节点,我们还需要一个 “导览员” 来带我们游览整个 list,这就是迭代器 ListIterator。它就像是我们手中的一根细棒,可以指向 list 中的任意一个节点,让我们能够方便地访问和操作元素。
构造函数 :它接受一个节点指针作为参数,默认指向空。这就像我们在开始游览之前,先确定了出发点。
拷贝构造函数 :当遇到一个已经存在的迭代器时,我们可以通过拷贝它的方式,快速地获得一个指向相同节点的迭代器。这就好比看到朋友手中有一个很好的导览路线,我们直接复制过来一样。
解引用操作符(operator*) :通过这个操作符,我们可以轻松地获取当前节点所存储的值。这相当于在游览过程中,我们停下脚步,仔细观察手中的珠子。
自增自减操作符(operator++、operator–) :这两个操作符就像是我们的双脚,可以带着我们在 list 的项链上向前或向后移动,指向下一个或前一个节点。
比较操作符(operator!=、operator==) :它们可以帮助我们判断两个迭代器是否指向同一个节点。这就好比在不同的游览路线中,我们可以比较是否来到了同一个景点。

list 的核心 —— list 类

现在,我们迎来了主角 —— list 类。它就像是一个精心编织的项链,将众多节点串联起来,并提供了一系列方法让我们能够灵活地操作它。

//list类template<class T>class list{typedef ListNode<T> Node;typedef Node* PNode;public:typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T&> const_iterator;public:///// List的构造list(){CreateHead(); }list(int n, const T& value = T()){CreateHead();PNode cur = _pHead;while (n--){PNode next = new Node(value);cur->_pNext = next;next->_pPre = cur;cur = next;_size++;}cur->_pNext = _pHead;_pHead->_pPre = cur;}template <class Iterator>list(Iterator first, Iterator last){CreateHead();PNode cur = _pHead;while (first != last){PNode next = new Node(*first);cur->_pNext = next;next->_pPre = cur;cur = next;first++;_size++;}cur->_pNext = _pHead;_pHead->_pPre = cur;}list(const list<T> &l){CreateHead();for(auto &a:l){push_back(a);}}list<T>& operator=(const list<T> l){CreateHead();swap(l);return *this;}~list(){clear();delete _pHead;_pHead = nullptr;}///// List Iteratoriterator begin(){return _pHead->_pNext;}iterator end(){return _pHead;}const_iterator begin()const{return _pHead->_pNext;}const_iterator end()const{return _pHead;}///// List Capacitysize_t size()const{return _size;}bool empty()const{return _size == 0;}//// List AccessT& front(){return _pHead->_pNext->_val;}const T& front()const{return _pHead->_pNext->_val;}T& back(){return _pHead->_pPre->_val;}const T& back()const{return _pHead->_pPre->_val;}// List Modifyvoid push_back(const T& val) {insert(end(), val); }void pop_back() { erase(--end()); }void push_front(const T& val) { insert(begin(), val);}void pop_front() { erase(begin()); }// 在pos位置前插入值为val的节点iterator insert(iterator pos, const T& val){PNode n = new Node(val);PNode pre = pos._pNode->_pPre;pre->_pNext = n;n->_pPre = pre;n->_pNext = pos._pNode;pos._pNode->_pPre = n;_size++;return n;}// 删除pos位置的节点,返回该节点的下一个位置iterator erase(iterator pos){PNode pre = pos._pNode->_pPre;PNode next = pos._pNode->_pNext;delete pos._pNode;pre->_pNext = next;next->_pPre = pre;_size--;return next;}void clear(){PNode cur = _pHead->_pNext;while (cur != _pHead){PNode next = cur->_pNext;delete cur;cur = next;}_pHead->_pNext = _pHead;_pHead->_pPre = _pHead;_size = 0;}void swap(list<T>& l){std::swap(_pHead, l._pHead);std::swap(_size, l._size);}//void print()//{//    for (auto c : *this)//    {//        cout << c << " ";//    }//    cout << endl;//}private:void CreateHead(){_pHead = new Node;_pHead->_pNext = _pHead;_pHead->_pPre = _pHead;_size = 0;}PNode _pHead;size_t _size;};
};

构造函数

默认构造函数会创建一个头节点 _pHead,它是一个特殊的节点,不存储实际数据,但起到了标记项链开头和结尾的作用。这就像我们在开始制作项链时,先打了个结。
可以指定元素个数和初始值来构造 list。这就像我们已经有了设计图,知道要制作多少颗珠子以及它们的颜色,于是按照这个设计直接把珠子串起来。
还可以从一个范围(通过迭代器指定开始和结束位置)来构造 list。这就像是我们从一个现成的珠子堆中,挑选
出一部分珠子,按照顺序串成项链。
拷贝构造函数能够复制一个已有的 list。这就好比看到了一件精美的项链作品,我们想模仿着制作一个一模一样的。
赋值操作符(operator=) :它通过 “拷贝 - 交换” 技术,先创建一个临时的 list,再与当前 list 进行交换。这就像我们先按照别人的项链样式做好一个新项链,然后把自己的旧项链换掉。
析构函数 :在 list 不再被需要时,析构函数会负责清理内存,删除所有节点,并释放头节点。这是在我们结束了项链的使用后,把它拆解,回收材料的过程。

迭代器相关操作

begin() 和 end() 方法分别返回指向 list 第一个节点和头节点(代表结束位置)的迭代器。这就像我们在游览项链时,确定了起点和终点。
const_iterator 版本的 begin() 和 end() 方法可以让我们在不修改 list 的情况下进行遍历,就像是我们戴着白手套,小心翼翼地观察项链上的珠子,而不去改变它们。

容量相关操作

size() 方法能够返回 list 当前的元素个数。这让我们可以清楚地知道项链上有多少颗珠子。
empty() 方法用于判断 list 是否为空,返回一个布尔值。这就像在检查项链是否已经断开,里面是否还有珠子。
元素访问操作
front() 和 back() 方法分别返回 list 第一个和最后一个元素的引用。这相当于我们直接拿起项链的开端或末端的珠子,查看它的模样。
修改操作
push_back() 和 pop_back() 方法用于在 list 的尾部添加或删除元素。这就像我们在项链的末端添加或取下一颗珠子。
push_front() 和 pop_front() 方法则是在 list 的头部进行添加或删除操作。这类似于我们在项链的开头位置进行珠子的增减。
insert() 方法可以在指定位置前插入一个元素。这就好比我们在项链的某个特定位置插入一颗新的珠子,需要调整相邻珠子的连接关系。
erase() 方法用于删除指定位置的元素,并返回下一个元素的位置。这就像我们在项链上取下一颗珠子后,要把剩下的珠子重新连接起来,并且告诉我们接下来的位置在哪里。
clear() 方法会清除 list 中的所有元素,将项链完全拆解,只剩下头节点。这通常在我们想要重新利用这条项链,重新设计样式时使用。
swap() 方法可以快速地交换两个 list 的内容。这就像我们把两条项链的珠子序列互换,但项链本身的结构(如头节点)保持不变。

结尾

通过以上对 list 的各个组成部分以及其成员函数的详细介绍(虽然这里的代码实现可能与 STL 中的 list 有些许不同,只是起到模拟作用),我们对 list 的工作原理和使用方法有了更深入的理解。它就像是我们手中的一条神奇项链,可以根据我们的需求,在任何位置灵活地添加或删除珠子,为我们处理数据提供了极大的便利。希望这次的 list 之旅能够让你对 C++ STL 有更进一步的认识,让我们在编程的世界里继续探索,发现更多宝藏!

相关文章:

STL中list的模拟

这里写目录标题 list 的节点 —— ListNodelist 的 “导览员” —— ListIteratorlist 的核心 —— list 类构造函数迭代器相关操作容量相关操作 结尾 在 C 的 STL&#xff08;标准模板库&#xff09;中&#xff0c;list 是一个十分重要的容器&#xff0c;它就像一个灵活的弹簧…...

【iOS】类结构分析

前言 之前我们已经探索得出对象的本质就是一个带有isa指针的结构体&#xff0c;这篇文章来分析一下类的结构以及类的底层原理。 类的本质 类的本质 我们在main函数中写入以上代码&#xff0c;然后利用clang对其进行反编译&#xff0c;可以得到c文件 可以看到底层使用Class接…...

Android 万能AI证件照 v1.3.2

在日常的生活和工作场景里&#xff0c;证件照的身影随处可见。找工作投简历时&#xff0c;它是展现你形象的 “第一张名片”&#xff1b;办理各类证件&#xff0c;缺了它可不行&#xff1b;参加各种考试报名&#xff0c;同样需要它。可以说&#xff0c;证件照虽小&#xff0c;却…...

【Java】封装在 Java 中是怎样实现的?

包 关于包有两个关键字 package : 声明当前类属于哪个包 和 import : 允许当前类使用其他类或接口时不使用全限定名 , 也就是导包 . IDEA 的普通项目文件包括 src : 包含源码和资源文件 和 out : 包含编译产物字节码文件 . 在 IDEA 开发环境建包会在 src 源码目录中生成 , 可…...

牛客网 NC14736 双拆分数字串 题解

牛客网 NC14736 双拆分数字串 题解 题目分析 解题思路 通过分析&#xff0c;我们可以发现&#xff1a; 当n≤3时&#xff0c;无法构造出双拆分数字串&#xff0c;因为数字位数太少对于n>3的情况&#xff0c;我们可以构造两种特殊形式&#xff1a; 当n为奇数时&#xff0c…...

超长文本注意力机制如何突破传统 O(n²) 瓶颈

介绍了当前在超长文本&#xff08;可达百万级及以上 Token&#xff09;生成与预测中&#xff0c;注意力机制如何突破传统 O(n) 瓶颈&#xff0c;并阐释多种高效注意力算法如何支持 超长上下文处理能力。 概览 当前主流 Transformer 在处理长序列时&#xff0c;由于每个 Token…...

异丙肌苷市场:现状、挑战与未来展望

摘要 本文聚焦异丙肌苷市场&#xff0c;深入分析了其市场规模与增长趋势、应用价值与市场驱动因素、面临的挑战以及竞争格局。异丙肌苷作为一种具有重要应用价值的改性核苷衍生物&#xff0c;在药物研发和治疗领域展现出潜力&#xff0c;但市场发展也面临诸多挑战。文章最后为…...

JAVA面向对象——对象和类的基本语法

JAVA面向对象——对象和类的基本语法 一、面向对象编程基础 1. 程序中的数据存储方式 基本类型&#xff1a;变量&#xff08;如 int max 15;&#xff09;。数据结构&#xff1a;数组&#xff08;一维/二维&#xff09;、对象&#xff08;特殊数据结构&#xff0c;用于存储复…...

【windows】音视频处理工具-FFmpeg(合并/分离)

一、FFmpeg介绍 FFmpeg是一个‌开源的跨平台音视频处理框架。 法国计算机程序员 Fabrice Bellard 于 2000 年创建。 “FF”&#xff08;代表 “Fast Forward”&#xff0c;快进之意&#xff09;与 “mpeg”&#xff08;流行的视频压缩标准 MPEG&#xff0c;即运动图像专家组&am…...

Java并发编程:从基础到高级实战

在现代软件开发中&#xff0c;并发编程已成为不可或缺的核心技能。随着多核处理器的普及和分布式系统的发展&#xff0c;能否编写高效、线程安全的并发程序直接决定了应用程序的性能和可靠性。Java作为一门成熟的企业级编程语言&#xff0c;提供了丰富的并发编程工具和API&…...

在 Excel 中使用东方仙盟软件————仙盟创梦IDE

安装插件 用仙盟创梦编写插件代码 源码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 东方仙盟.仙盟创梦IDE_招标系统 {public static class 仙盟创梦_招标专…...

win7无线网络名称显示为编码,连接对应网络不方便【解决办法】

使用多个网络时可能需要切换到打印机的网络来打印东西&#xff0c;但是win7的编码问题导致不知道哪个网络是对应网络&#xff0c;可以使用批处理命令来自动连接道指定网络 将这个代码用文本文件打开后粘贴&#xff0c;然后另存为ansi格式的bat文件 代码中使用两种方式进行连接…...

.NET 10 - 尝试一下Minimal Api的Validation新特性

1.简单介绍 2025年11月微软将会发布.NET10&#xff0c;这是LTS(Long Term Support)版本。当前.NET10已经处于Preview4版本&#xff0c;微软对Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微软对Minimal Api一直在持续地更新。在.NET8中, Mi…...

C# Task 与 SynchronizationContext

示例代码 using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks;namespace Test {internal class Program{static void Main(string[] args){_mainThreadSynchronizationContext new ThreadSynchronizationContext(&qu…...

iOS Runtime与RunLoop的对比和使用

Runtime 机制 核心概念 Objective-C 的动态特性&#xff1a;Objective-C 是一门动态语言&#xff0c;很多工作都是在运行时而非编译时决定的消息传递机制&#xff1a;方法调用实际上是发送消息 objc_msgSend(receiver, selector, ...)方法决议机制&#xff1a;动态方法解析、…...

JavaSenderMail发送邮件(QQ及OFFICE365)

前言 这是今天处理的公司安排的一个任务&#xff1a;客户系统发送offices365邮件报错535 之前没怎么解除邮件业务&#xff0c;于是先搭个简单的QQ邮件Demo熟悉一下吧&#xff0c;没有啥公网内网的麻烦&#xff08;之前听说有内网限制&#xff0c;我还处理了一些环境上的问题&…...

八股文--JVM(2)

⭐️⭐️6.类加载 类加载器 JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码加载到JVM中&#xff0c;从而让程序启动 1.启动类加载器 ----JAVA_HOME/jre/libC编写加载的是JAVA_HOME/jre/lib 2.拓展类加载器 ----JAVA_HOME/jre/lib/ext 3.应用类加载器 ----C…...

【HTML-3】HTML 中的水平线与换行:基础元素详解

在网页设计中&#xff0c;合理的布局和内容分隔对于提升用户体验至关重要。HTML 提供了两个简单但强大的元素来实现这些功能&#xff1a;水平线 (<hr>) 和换行 (<br>)。本文将深入探讨这两个元素的用法、最佳实践以及现代替代方案。 1. 水平线 <hr> 元素 1…...

绿色云计算:数字化转型与可持续发展的完美融合

目录 引言 绿色云计算的概念与定义 云计算的环境影响与绿色云计算的重要性 绿色云计算的技术实践与策略 绿色云计算的案例研究与最佳实践 绿色云计算的挑战与限制 绿色云计算的未来趋势与预测 结论与展望 引言 随着云计算技术的迅猛发展和广泛应用&#xff0c;其环境影…...

AMO——下层RL与上层模仿相结合的自适应运动优化:让人形行走操作(loco-manipulation)兼顾可行性和动力学约束

前言 自从去年24年Q4&#xff0c;我司侧重具身智能的场景落地与定制开发之后 去年Q4&#xff0c;每个月都会进来新的具身需求今年Q1&#xff0c;则每周都会进来新的具身需求Q2的本月起&#xff0c;一周不止一个需求 特别是本周&#xff0c;几乎每天都有国企、名企通过我司找到…...

大模型——多模态检索的RAG系统架构设计

文章目录 1. 系统架构设计核心组件 2. 跨模态向量空间对齐方案方法一&#xff1a;预训练对齐模型&#xff08;如CLIP&#xff09;方法二&#xff1a;跨模态投影网络方法三&#xff1a;联合微调 3. 混合检索策略4. 关键问题解决Q: 如何解决模态间向量尺度不一致&#xff1f;Q: 如…...

BUUCTF——Kookie

BUUCTF——Kookie 进入靶场 一个登录页面 左上角提示让以admin身份登录 找到了cookie 应该与cookie相关 测试了一下admin admin没登上 We found the account cookie / monster 回头看了一下 这个是不是账号密码 测试一下 成功登入 但是没有flag 应该还是跟cookie相关 …...

代码随想录算法训练营

力扣684.冗余连接【medium】 力扣.冗余连接Ⅱ【hard】 一、力扣684.冗余连接【medium】 题目链接&#xff1a;力扣684.冗余连接 left x300 视频链接&#xff1a;代码随想录 题解链接&#xff1a;灵茶山艾府 1、思路 可以从前向后遍历每一条边&#xff08;因为优先让前面的边连上…...

服务器磁盘不同格式挂载区别

在Linux系统中&#xff0c;磁盘不同格式挂载的核心区别主要体现在‌文件系统类型‌和‌挂载方式‌两个方面&#xff0c;以下为具体差异分析&#xff1a; 一、文件系统类型区别 磁盘格式即文件系统类型的选择直接影响挂载后的性能和功能&#xff1a; ‌常见文件系统比较‌ ‌e…...

AI智能分析网关V4人员摔倒检测打造医院/工厂等多场景智能安全防护体系

一、方案背景​ 随着全球老龄化加剧&#xff0c;我国老年人口占比持续攀升&#xff0c;老年人摔倒伤亡事件频发&#xff0c;居家、养老机构等场景的摔倒防控成为社会焦点。同时&#xff0c;工厂、医院、学校等人员密集场所也易发生意外摔倒安全事故。传统人工监控存在视觉疲劳…...

window 显示驱动开发-准备 DMA 缓冲区

显示微型端口驱动程序必须及时准备 DMA 缓冲区。 当 GPU 处理 DMA 缓冲区时&#xff0c;通常调用显示微型端口驱动程序来准备下一个 DMA 缓冲区&#xff0c;以便提交到 GPU。 若要防止 GPU 耗尽&#xff0c;显示微型端口驱动程序在准备和提交后续 DMA 缓冲区时所花费的时间必须…...

程序设计实践--排序(1)

&#xff11;、插入排序&#xff08;一个数组&#xff09; #include<bits/stdc.h> using namespace std; const int N1e35; int a[N]; int n; int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){int va[i];int ji-1;while(j>1&am…...

window 显示驱动开发-GDI 硬件加速

Windows 7 引入的 GDI 硬件加速功能在图形处理单元 (GPU) 上提供加速的核心图形设备接口 (GDI) 操作。 若要指示 GPU 和驱动程序支持此功能&#xff0c;显示微型端口驱动程序必须将DXGKDDI_INTERFACE_VERSION设置为 > DXGKDDI_INTERFACE_VERSION_WIN7。 显示微型端口驱动程…...

驱动开发硬核特训 · Day 31:理解 I2C 子系统的驱动模型与实例剖析

&#x1f4da; 训练目标&#xff1a; 从驱动模型出发&#xff0c;掌握 I2C 子系统的核心结构&#xff1b;分析控制器与从设备的注册流程&#xff1b;结合 AT24 EEPROM 驱动源码与设备树实例&#xff0c;理解 i2c_client 与 i2c_driver 的交互&#xff1b;配套高质量练习题巩固理…...

网络安全之网络攻击spring临时文件利用

0x00 传统攻击流程 我们之前传统的攻击流程由以下几个步骤来完成 攻击者找到可以控制目标JDBC连接fakeServer的地方目标向fakeServer发起连接请求fakeServer向目标下发恶意数据包目标解析恶意数据包并完成指定攻击行为&#xff08;文件读取、反序列化&#xff09;&#xff0c…...

统一端点管理(UEM):定义、优势与重要性

统一终端管理&#xff08;UEM&#xff09;​​是一种通过单一平台集中管理、监控和保护企业所有终端设备&#xff08;如笔记本电脑、移动设备、服务器、物联网设备等&#xff09;的综合性策略。其核心在于跨操作系统&#xff08;Windows、macOS、iOS、Android等&#xff09;实现…...

什么是Rootfs

Rootfs (Root Filesystem) 详解 buildroot工具构建了一个名为"rootfs.tar"的根文件系统压缩包。 什么是rootfs Rootfs&#xff08;Root Filesystem&#xff0c;根文件系统&#xff09;是操作系统启动后挂载的第一个文件系统&#xff0c;它包含系统正常运行所需的基…...

黑马Java基础笔记-13常用查找算法

查找算法 基本查找(也叫顺序查找&#xff0c;线性查找) 二分查找&#xff08;需要有序数据&#xff09; public static int binarySearch(int[] arr, int number){//1.定义两个变量记录要查找的范围int min 0;int max arr.length - 1;//2.利用循环不断的去找要查找的数据wh…...

#渗透测试#批量漏洞挖掘#LiveBos UploadFile(CVE-2021-77663-2336) 任意文件上传漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

Git 和 GitHub 学习指南本地 Git 配置、基础命令、GitHub 上传流程、企业开发中 Git 的使用流程、以及如何将代码部署到生产服务器

Windows 上 Git 安装与配置 下载安装&#xff1a;访问 Git 官方网站下载适用于 Windows 的安装程序。运行安装包时会出现许可协议、安装目录、组件选择等界面&#xff08;如下图&#xff09;。在“Select Components”页面建议勾选 Git Bash Here 等选项&#xff0c;以便在资源…...

SUI批量转账几种方法介绍

一、Sui区块链简介 Sui是由前Meta&#xff08;Facebook&#xff09;工程师创建的下一代Layer 1区块链&#xff0c;采用基于Move编程语言的新型智能合约平台。Sui的设计专注于高吞吐量、低延迟和可扩展性&#xff0c;使其特别适合需要处理大量交易的场景。 Sui的核心特点&…...

Vue2到Vue3迁移问题解析

1. 响应式系统的变化 问题&#xff1a;Vue3 使用 Proxy 替代 Object.defineProperty&#xff0c;导致部分 Vue2 的响应式写法失效。解析&#xff1a; 数组直接索引修改&#xff1a;// Vue2&#xff1a;需使用 Vue.set 或 splice this.$set(this.items, 0, new value); this.it…...

【解决】rpm 包安装成功,但目录不存在问题

开发平台&#xff1a;RedHat 8   一、问题描述 [rootproxy ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec # rpmbuild 制作 .rpm 包 [rootproxy ~]# yum -y install /root/rpmbuild/RPMS/x86_64/nginx-1.22.1-1.x86_64.rpm # 安装 .rpm包 …...

深度学习框架显存泄漏诊断手册(基于PyTorch的Memory Snapshot对比分析方法)

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、显存泄漏&#xff1a;深度学习开发者的"隐形杀手" 在深度学习模型的训练与推…...

PyTorch中单卡训练、DataParallel(DP)和DistributedDataParallel(DDP)

PyTorch中提供了单卡训练、DataParallel&#xff08;DP&#xff09;和DistributedDataParallel&#xff08;DDP&#xff09;&#xff0c;下面是相关原理与实现代码。 代码下载链接&#xff1a;git代码链接 一、单卡训练 原理 单卡训练是最基础的模型训练方式&#xff0c;使用…...

Redis从入门到实战 - 高级篇(中)

一、多级缓存 1. 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&#xff0c;会…...

项目计划缺乏可行性,如何制定实际可行的计划?

制定实际可行的项目计划需从明确项目目标、准确评估资源、风险管理、设定合理里程碑以及优化沟通渠道入手。其中&#xff0c;明确项目目标尤为关键&#xff0c;只有在目标清晰、具体且量化时&#xff0c;团队才能有效规划各项活动并衡量进展。例如&#xff0c;目标若模糊或过于…...

React中使用ahooks处理业务场景

// 从 ahooks 引入 useDynamicList 钩子函数&#xff0c;用于管理动态列表数据&#xff08;增删改&#xff09; import { useDynamicList } from ahooks;// 从 ant-design/icons 引入两个图标组件&#xff1a;减号圆圈图标和加号圆圈图标 import { MinusCircleOutlined, PlusCi…...

CNBC专访CertiK联创顾荣辉:从形式化验证到AI赋能,持续拓展Web3.0信任边界

近日&#xff0c;CertiK联合创始人、哥伦比亚大学教授顾荣辉接受全球知名财经媒体CNBC阿拉伯频道专访&#xff0c;围绕形式化验证的行业应用、AI在区块链安全中的角色&#xff0c;以及新兴技术风险等议题&#xff0c;分享了其对Web3.0安全未来的深刻洞察。 顾荣辉表示&#xf…...

基于Spring Boot与jQuery的用户管理系统开发实践✨

引言&#x1f4da; 用户管理系统是企业级应用的核心模块&#xff0c;需实现数据分页、状态管理及高效前后端交互。本文以Spring Boot为后端框架、jQuery为前端工具&#xff0c;构建一个结构清晰的用户管理系统&#xff0c;详解三层架构设计、接口规范及全栈开发流程&#xff0…...

StreamSaver实现大文件下载解决方案

StreamSaver实现大文件下载解决方案 web端 安装 StreamSaver.js npm install streamsaver # 或 yarn add streamsaver在 Vue 组件中导入 import streamSaver from "streamsaver"; // 确保导入名称正确完整代码修正 <!--* projectName: * desc: * author: dua…...

vue3+echarts 做温度计

参考Echarts 做的温度计_echart温度计-CSDN博客 但是现在这个写法不支持了&#xff0c;更新一下&#xff0c;然后修改了温度值和刻度及单位颜色为黑&#xff0c;初始化echarts写法, itemStyle: {normal: {color: #4577BA,barBorderRadius: 50,}},<div id"main14"…...

鸿蒙开发——7.ArkUI进阶:@BuilderParam装饰器的核心用法与实战解析

鸿蒙开发——7.ArkUI进阶&#xff1a;BuilderParam装饰器的核心用法与实战解析 ArkUI进阶&#xff1a;BuilderParam装饰器的核心用法与实战解析引言一、核心概念速览1.1 什么是BuilderParam&#xff1f;1.2 与Builder的关系 二、核心使用场景2.1 参数初始化组件2.2 尾随闭包初始…...

【数据结构】队列的完整实现

队列的完整实现 队列的完整实现github地址前言1. 队列的概念及其结构1.1 概念1.2 组织结构 2. 队列的实现接口一览结构定义与架构初始化和销毁入队和出队取队头队尾数据获取size和判空 完整代码与功能测试结语 队列的完整实现 github地址 有梦想的电信狗 前言 ​ 队列&…...

销售易史彦泽:从效率工具到增长引擎,AI加速CRM不断进化

导读&#xff1a;AI的加入&#xff0c;让CRM实现从“人适配系统”到“系统适配人”&#xff0c;从“管控工具”向“智能助手”跃迁&#xff0c;重构客户关系管理的底层逻辑。 作者 | 小葳 图片来源 | 摄图 AI应用与SaaS的关系&#xff0c;是当前科技与商业领域热议的话题。 当…...