C++之list类及模拟实现
目录
list的介绍
list的模拟实现
定义节点
有关遍历的重载运算符
list的操作实现
(1)构造函数
(2)拷贝构造函数
(3)赋值运算符重载函数=
(4)析构函数和clear成员函数
(5)尾插/头插和尾删/头删
(6)size成员函数
(7)在任意位置插入 (insert)
(8)任意位置删除(erase)
(9)迭代器
完整代码展示
vector和list的比较
1.排序
(1)list和vector排序
(2)list copy vector sort copy list sort和list
2.总结
list的介绍
(1)list类其实就是链表,但是它是双向链表。在数据结构中我们了解过双向链表的特点。下面我们回忆一下。
1.节点中具有两个指针。一个指针指向该节点的前一个节点,另一个指针指向该节点的下一个节点。
2.存在哨兵位。初始化的时候节点里的下一个节点和上一个节点都指向自己。
(2)STL中list的底层结构
list的模拟实现
定义节点
我们先定义双向链表的节点并初始化。
template <class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& x = T()):_next(nullptr), _prev(nullptr), _data(x){}};
有关遍历的重载运算符
list容器有迭代器,那么就可以进行遍历,因此我们要可以++,--等运算符重载。而且在插入删除操作中我们常常需要 ‘.’ '->'对链表进行遍历。因为普通迭代器和const迭代器中只有operator*和operator->的返回值有区别,所以我们就在模板上多增加了两个模板参数。
代码如下:
template<class T,class Ref,class Ptr>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T, Ref, Ptr> Self;Node* _node;list_iterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}//C++规定后缀调用需要有一个int型参数作为区分前缀与后缀调用的区别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;}bool operator==(const Self& lt){return _node == lt._node;//结构体变量用「.」来访问成员,而结构体指针用「->」来访问。}bool operator!=(const Self& lt){return _node != lt._node;}};
list的操作实现
(1)构造函数
创建节点并把节点中的指针全部指向自己。
list()
{
_head = new node;
_head->_next = _head;
_head->_prev = _head;
}
(2)拷贝构造函数
先构造a1,再把lt中的资源尾插给a1。
void empty_Init(){_head = new node;_head->_next = _head;_head->_prev = _head;} //a1(a2),a1是新建的list(const list<T>& lt){empty_Init();for (auto& e : lt){push_back(e);}}//initializer_list<T>list(std::initializer_list<T> lt){empty_Init();for (auto& e : lt){push_back(e);}}
两种拷贝构造的区别:
(3)赋值运算符重载函数=
void swap(list<T>& lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}//lt1=ltlist<T>& operator=(list<T>& lt){swap(lt);return *this;}
看到这个代码我们就会想为什么运算符重载中的形参不加const呢?如果加了const就像 void swap(*this,const list<T>& y)一样,这样是会报错的,两边类型不同,swap函数是一个函数模板,只有一个模板参数,那么有人会说把这个改成类型相同的不就行了。但是我们知道const list<T>& lt中const修饰list<T>
类型,则lt
引用的对象(即 list<T>
)是常量对象,不能通过 lt
修改它的内容。它的值在初始化后就不能改变,而在swap函数中需要交换它们的资源,那么lt就需要改变。
(4)析构函数和clear成员函数
clear的作用只是清理链表的节点,只剩下哨兵位,并不会释放空间。
~list(){clear();delete _head;_head = nullptr;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}
(5)尾插/头插和尾删/头删
void push_back(const T&x){insert(end(), x);}void push_front(const T&x){insert(begin(), x);}void pop_back(){erase(--end());//end()是哨兵位}void pop_front(){erase(begin());}
(6)size成员函数
size_t size()const{return _size;}
(7)在任意位置插入 (insert)
typedef list_iterator<T,T&,T*> iterator; void insert(iterator pos, const T& x){node* newnode = new node(x);node*pre = pos._node;node* prev = pre->_prev;prev->_next = newnode;newnode->_prev = prev;newnode->_next = pre;pre->_prev = newnode;_size++;}
注意:pos的类型是list_iterator<T,T&,T*>,这个类中的成员变量只有_node,而_node的类型才是list_node,类型为list_node才有节点的成员变量。所以我们要node*pre = pos._node,而不能直接使用pos。
(8)任意位置删除(erase)
list中的erase也会有迭代器失效,所以我们需要返回下一个迭代器。
typedef list_iterator<T,T&,T*> iterator; iterator erase(iterator pos){assert(pos != end());node* pre = pos._node;node* prev = pre->_prev;node* next = pre->_next;delete pre;prev->_next = next;next->_prev = prev;_size--;return iterator(next);}
(9)迭代器
iterator begin(){iterator it(_head->_next);//调用了list_iterator类模板的构造函数return it;}iterator end(){iterator it(_head);return it;}const_iterator begin()const{const_iterator it(_head->_next);return it;}const_iterator end()const{const_iterator it(_head);return it;}
完整代码展示
#include<assert.h>
namespace slm
{//创建节点template <class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& x = T()):_next(nullptr), _prev(nullptr), _data(x){}};//实现运算符重载template<class T,class Ref,class Ptr>//template<class T,class T&,class T*>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T, Ref, Ptr> Self;Node* _node;list_iterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}//C++规定后缀调用需要有一个int型参数作为区分前缀与后缀调用的区别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;}bool operator==(const Self& lt){return _node == lt._node;//结构体变量用「.」来访问成员,而结构体指针用「->」来访问。}bool operator!=(const Self& lt){return _node != lt._node;}};template<class T>class list{typedef list_node<T> node;typedef list_iterator<T,T&,T*> iterator;typedef list_iterator<T,const T&,const T*> const_iterator;public:iterator begin(){iterator it(_head->_next);return it;}iterator end(){iterator it(_head);return it;}const_iterator begin()const{const_iterator it(_head->_next);return it;}const_iterator end()const{const_iterator it(_head);return it;}void empty_Init(){_head = new node;_head->_next = _head;_head->_prev = _head;}list(){empty_Init();}//a1(a2)list(const list<T>& lt){empty_Init();for (auto& e : lt){push_back(e);}}list(std::initializer_list<T> lt){empty_Init();for (auto& e : lt){push_back(e);}}void swap(list<T>& lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}//lt1=ltlist<T>& operator=(list<T>& lt){swap(lt);return *this;}~list(){clear();delete _head;_head = nullptr;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}size_t size()const{return _size;}void push_back(const T&x){insert(end(), x);}//在pos前插入void insert(iterator pos, const T& x){node* newnode = new node(x);node*pre = pos._node;node* prev = pre->_prev;prev->_next = newnode;newnode->_prev = prev;newnode->_next = pre;pre->_prev = newnode;_size++;}iterator erase(iterator pos){assert(pos != end());node* pre = pos._node;node* prev = pre->_prev;node* next = pre->_next;delete pre;prev->_next = next;next->_prev = prev;_size--;return iterator(next);}void push_front(const T&x){insert(begin(), x);}void pop_back(){erase(--end());//end()是哨兵位}void pop_front(){erase(begin());}private:node* _head;size_t _size;};
}
vector和list的比较
1.排序
(1)list和vector排序
#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
void test_op1()
{srand(time(0));const int N = 1000000;list<int> lt1;vector<int> v;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);v.push_back(e);}int begin1 = clock();// vector排序sort(v.begin(), v.end());int end1 = clock();//list排序int begin2 = clock();lt1.sort();int end2 = clock();printf("vector sort:%d\n", end1 - begin1);printf("list sort:%d\n", end2 - begin2);
}
int main()
{
test_op1();
return 0;
}
从结果中我们发现list排序比vector排序快了两倍多。
(2)list copy vector sort copy list sort和list
那如果我们先把list类资源拷贝构造给vector排序,排完序后又拷贝回list类,那结果会是如何呢?
#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
void test_op2()
{srand(time(0));const int N = 10000;list<int> lt1;list<int> lt2;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);lt2.push_back(e);}int begin1 = clock();// 拷贝vectorvector<int> v(lt2.begin(), lt2.end());// 排序sort(v.begin(), v.end());// 拷贝回lt2lt2.assign(v.begin(), v.end());int end1 = clock();int begin2 = clock();lt1.sort();int end2 = clock();printf("list copy vector sort copy list sort:%d\n", end1 - begin1);printf("list sort:%d\n", end2 - begin2);
}int main()
{test_op2();return 0;
}
我们发现上面list先拷贝构造成vector类在排序,排完序后再拷贝回list的效率还是比直接list排序慢。
2.总结
vector | list | |
底 层 结 构 | 动态顺序表,一段连续空间 | 带头结点的双向循环链表 |
随 机 访 问 | 支持随机访问,访问某个元素效率O(1) | 不支持随机访问,访问某个元 素效率O(N) |
插 入 和 删 除 | 任意位置插入和删除效率低,需要搬移元素,时间 复杂度为O(N),插入时有可能需要增容,增容: 开辟新空间,拷贝元素,释放旧空间,导致效率更 低 | 任意位置插入和删除效率高, 不需要搬移元素,时间复杂度 为O(1) |
空 间 利 用 率 | 底层为连续空间,不容易造成内存碎片,空间利用 率高,缓存利用率高 | 底层节点动态开辟,小节点容 易造成内存碎片,空间利用率 低,缓存利用率低 |
迭 代 器 | 原生态指针 | 对原生态指针(节点指针)进行 封装 |
迭 代 器 失 效 | 在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效. 删除时,当前迭代器需要重新赋值否则会失效 | 插入元素不会导致迭代器失 效,删除元素时,只会导致当 前迭代器失效,其他迭代器不 受影响 |
使 用 场 景 | 需要高效存储,支持随机访问,不关心插入删除效率 | 大量插入和删除操作,不关心 随机访问 |
相关文章:
C++之list类及模拟实现
目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 (1)构造函数 (2)拷贝构造函数 (3)赋值运算符重载函数 (4)析构函数和clear成员函数 (5)尾…...
C++八大常见的设计模式的实现与实践指南
目录 创建型模式 单例模式工厂方法模式抽象工厂模式 结构型模式 适配器模式装饰者模式代理模式 行为型模式 观察者模式策略模式命令模式 高级主题 现代C特性影响模式性能对比典型应用案例 设计模式分类 一、创建型模式 1. 单例模式(Singleton) 现代…...
02 windows qt配置ffmpeg开发环境搭建
版本说明 首先我使用ffmpeg版本是4.2.1QT使用版本5.14.2我选择是c编译...
什么是状态管理?有何种方式可以实现?它们之间有什么区别?
目录 一、状态管理的核心概念 二、常见状态管理方案及对比 1. 基础方案:setState 2. 官方推荐:Provider 3. 事件驱动:Bloc (Business Logic Component) 4. 响应式增强:Riverpod 5. 轻量级全能库:GetX 三、方案对比与选型指南 四、实战建议 在 Flutter 中,状态管…...
tf1.x和tf2.x在使用上的区别和联系是什么
tf1.x和tf2.x在使用上的区别和联系是什么 TensorFlow 1.x 和 2.x 在使用上有显著差异,主要体现在编程范式、API 设计和易用性上,但二者仍共享相同的核心目标(深度学习框架)和底层计算引擎。以下是主要区别和联系: 主要…...
Elasticsearch使用记录
一、配环境 1.docker版本部署es 8.x系列可以关掉ssl(本地测试时),去docker的/usr/share/elasticsearch/config/elasticsearch.yml里面的“xpack.security.enabled:”设置成true就可以 2.window docker部署推荐教程:基于Docker安…...
【python web】一文掌握 Flask 的基础用法
文章目录 一、 Flask 介绍1.1 安装 Flask二、Flask的基本使用2.1 创建第一个 Flask 应用2.2 路由与视图函数2.3 请求与响应2.4 响应对象2.5 模板渲染2.6 模板继承2.7 静态文件管理2.8 Blueprint 蓝图2.9 错误处理三、Flask扩展与插件四、部署 Flask 应用五、总结Flask 是一个轻…...
第十六届蓝桥杯单片机组4T模拟赛二
难点: PCF8591同时测量两条通道数据 避免重复触发 采集触发时的时间数据存放 未采集的数据显示 清空数据 本题建议了解怎么去触发采集,怎么显示最近三次触发采集的时间即可。由于4T模拟赛的尿性有很多评测点是题目中没有要求的,另外测评的时候…...
《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》
在数字化浪潮汹涌澎湃的当下,人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋,其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目,开启了智能生态的新篇章。 华为MindSpore:AI框架的创新先锋…...
kotlin中的list set map整理
在 Kotlin 中,List、Set 和 Map 是三种核心集合类型,它们分别适用于不同的场景,具有独特的特性和操作方式。以下是它们的详细对比与使用指南: 1. List(列表) 核心特性 • 有序:元素按插入顺序…...
条款43:学习处理模板化基类内的名称
前提认知:模板类继承模板类,是需要建立在假设的前提下的,如果没有这个”假设“,编译将会失败 1.书上举例 2.完整代码举例 #include <iostream>class MsgInfo { };class BaseCompany { public:BaseCompany(){}~BaseCompan…...
五种方案实现双链路可靠数据传输
本文介绍五种双链路数据传输方案,目标是利用设备的多个传输通道,(如双有线网口,网口+wifi, 网口+5G等场景 , 网口+ 自组网, 自组网 + 5G等),将数据复制后分流、分路同时传输,以期提高数据传输可靠性,满足高可靠性传输的应用场景需求。部分方案给出了实际验证结果 。 …...
提升AI性能的秘密武器:量化、蒸馏与剪枝全面解析
通过高效的模型压缩技术推进 NLP 在快速发展的自然语言处理 (NLP) 领域,模型的大小和复杂性显著增加,从而显著提高了性能。然而,这些庞大模型的部署和维护也带来了挑战,特别是在计算成本、功耗和资源受限用户的可访问性方面。本博客深入探讨了量化、剪枝和蒸馏等尖端模型压…...
React Native 如何使用 Expo 快速开发?
React Native是当下热门的跨平台移动开发框架,而Expo则是它的重要开发工具之一。Expo提供了一套完整的开发环境,使开发者无需安装Android Studio或Xcode也能快速运行React Native项目。它包含了众多内置API,如相机、地理位置、推送通知等&…...
C++Primer 拷贝控制示例
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
Qt 读取数据库
在 Qt 中读取数据库文件通常涉及以下步骤。这里以 SQLite 为例(Qt 内置支持),其他数据库(如 MySQL、PostgreSQL)需要对应驱动: 1. 添加 SQL 模块依赖 在项目文件 .pro 中添加: QT sql2. 基本…...
DeepSeek在学术研究方向初期工作提示词分享
目录 论文选题 研读文献 拟定提纲 大家好这里是AIWritePaper官方账号!更多内容👉AIWritePaper~在如今这个学术圈的“快车道”上,时间就像是一场永不停歇的赛跑,而论文质量则是那颗我们拼命追逐的“金苹果”。最近一款名为DeepS…...
CentOS下安装ElasticSearch(日志分析)
准备目录 搞一个自己喜欢的目录 mkdir /usr/local/app 切换到该目录 cd /usr/local/app 下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz 选择其他版本 点击进入官网...
科技云报到:AI Agent打了个响指,商业齿轮加速转动
科技云报到原创。 3月16日,百度旗下文心大模型4.5和文心大模型X1正式发布。目前,两款模型已在文心一言官网上线,免费向用户开放。 同时,文心大模型4.5已上线百度智能云千帆大模型平台,企业用户和开发者登录即可调用AP…...
布谷直播系统源码开发实战:从架构设计到性能优化
作为山东布谷科技的一名技术研发人员,我参与了多个直播系统平台从0到1的开发和搭建,也见证了直播行业从萌芽到爆发的全过程。今天,我想从研发角度,分享一些直播系统软件开发的经验和心得,希望能对大家有所帮助。 一、 …...
pytorch小记(十):pytorch中torch.tril 和 torch.triu 详解
pytorch小记(十):pytorch中torch.tril 和 torch.triu 详解 PyTorch torch.tril 和 torch.triu 详解1. torch.tril(计算下三角矩阵)📌 作用🔍 语法🔹 参数📌 示例…...
C语言每日一练——day_11
引言 针对初学者,每日练习几个题,快速上手C语言。第十一天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中…...
HCIA-PPP实验
一、LCP链路控制协议 1、链路建立阶段:通过交互LCP报文协商参数,包含了MRU、认证类型、魔术字等。 2、链路维护阶段: 3、链路终止 二、NCP网络控制协议:交互PPP IPCP报文,检测地址、学习路由、下发地址 1、通过IPCP协议的请求消…...
C++学习之云盘项目nginx
1.复习 2.知识点概述 1. 一些基本概念 1.1 Nginx 初步认识 1.2 正向 / 反向代理 1.3 域名和 IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx 的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 课外知识导读 1. URL 和 URI 2. DNS 解析过程 1. 一些基…...
7-字符串
1-ASCII 0-9 对应 48-57 A-Z 对应 65-90 a-z 对应 97-122 2-字符数组 字符变量存储单个字符 字符数组存储多个字符 字符串就是字符数组加上结束符 ’ \0 ’ #include <iostream> using namespace std; int main(){//是字符数组,不是字符串char a1[]{C,,};…...
vue学习八
十七 组件通信方式 1 props 父传子 //父组件 <script setup>//book来源省略import Subview1 from ./Subview1.vue;function updatebook(updatetimes){book.value.updatetimes updatetimes} </script> <template><Subview1 :book"book" :upd…...
Vue 渲染 LaTeX 公式 Markdown 库
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
基于大模型的喉癌全程预测与治疗方案优化研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与数据来源 二、大模型在喉癌预测中的应用原理 2.1 大模型概述 2.2 预测喉癌的技术原理 2.3 相关技术对比 三、术前预测与方案制定 3.1 术前风险预测 3.1.1 淋巴结转移预测 3.1.2 其他风险因素预…...
SpringBoot第三站:配置嵌入式服务器使用外置的Servlet容器
目录 1. 配置嵌入式服务器 1.1 如何定制和修改Servlet容器的相关配置 1.server.port8080 2. server.context-path/tx 3. server.tomcat.uri-encodingUTF-8 1.2 注册Servlet三大组件【Servlet,Filter,Listener】 1. servlet 2. filter 3. 监听器…...
通向AGI的未来之路!首篇2D/视频/3D/4D统一生成框架全景综述(港科大中山等)
文章链接: https://arxiv.org/pdf/2503.04641 摘要 理解并复现现实世界是人工通用智能(AGI)研究中的一个关键挑战。为实现这一目标,许多现有方法(例如世界模型)旨在捕捉支配物理世界的基本原理࿰…...
什么是MCP(Model Context Protocol)?对话、意图识别、服务调用和上下文管理
什么是MCP? MCP(Model Context Protocol) 是一种专为人工智能模型设计的通信协议,旨在解决复杂 AI 系统中多个模型或组件之间的协同、状态管理和资源优化问题。它尤其适用于大型语言模型(LLM)、多模态系统及…...
第二十七篇 数据仓库与维度建模指南:从理论到实战的进阶之路
声明:文章内容仅供参考,需仔细甄别。文中技术名称属相关方商标,仅作技术描述;代码示例为交流学习用途,部分参考开源文档(Apache 2.0/GPLv3);案例数据已脱敏,技术推荐保持…...
定时任务引起的死锁
定时任务引起的死锁 前言:Java面试题 死锁的场景有哪些?你们是怎么解决的? 锁有哪些特性? 问题现象 1,文件上传报当前功能正在使用,请稍后再试 2,其他账号登录系统,登录不上去&a…...
NewStar CTF web wp
文章目录 week1headach3会赢吗智械危机谢谢皮蛋PangBai 过家家(1) week3include meblindsql1臭皮的计算机臭皮踩踩背这照片是你吗 week4Pangbai过家家四blindsql2chocolateezcmsssezpollute隐藏的密码 weeek5pangbai过家家(5)redissqlshell臭皮吹泡泡臭皮…...
Docker运行postgreSQL,由于异常启动或者退出后,提示could not locate a valid checkpoint record
pg_resetwal 是 PostgreSQL 的“急救工具”,用于在极端情况下修复因 WAL 或控制文件损坏导致的启动问题。 但需注意: 风险极高,可能导致数据不一致。必须立即转储并恢复,避免直接在修复后的数据库中执行写操作。仅在备份后使用&…...
Leetcode 刷题笔记1 图论part01
图论的基础知识: 图的种类: 有向图(边有方向) 、 无向图(边无方向)、加权有向图(边有方向和权值) 度: 无向图中几条边连接该节点,该节点就有几度࿱…...
文件管理系统
前言:之前我们讨论的是被打开文件的管理,那么未被打开的文件是如何管理的呢? 1.认识磁盘设备 1.1磁盘的物理结构 磁盘是由盘片(盘面,扇区,磁道,柱面),磁头,…...
荣耀手机卸载应用商店、快应用中心等系统自带的
1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…...
结合基于标签置信度的特征选择方法用于部分多标签学习-简介版
假设 部分多标签学习(PML)假设:假设样本的标签集合中存在伪正标签,即某些标签可能是错误的。目标是从候选标签集中识别出真实标签。特征与标签的关系假设:假设不同的标签对应的特征子空间可能是不同的,而不…...
【小白向】Word|Word怎么给公式标号、调整公式字体和花括号对齐
【小白向】Word|Word怎么给公式标号、调整公式字体和花括号对齐 我的版本:Word 2021 如需快速查看关键步骤,请直接阅读标红部分。 如果遇到无法调整的情况,可以直接下载我的示例文档进行参考:花括号和其他的示例公式.…...
基于香橙派 KunpengPro学习CANN(2)——Ascend Extension for PyTorch 配置与安装
将 PyTorch 网络迁移到昇腾平台并执行训练或推理,直接使用昇腾提供的构图接口构图。Ascend Extension for PyTorch插件用于适配PyTorch框架,可以使用昇腾AI处理器的算力。 1 pip 安装 # 下载PyTorch安装包 wget https://download.pytorch.org/whl/cpu/…...
【备赛】遇到的小问题-1
问题描述-1 想实现的功能是,通过ADC实时测量某引脚的电压及其占空比。 可以通过旋转电位器,更改其电压。 首先我定义了这几个变量 uint32_t adc_value;//HAL库函数里面得出的采样值(实时更新) uint32_t percentage6;//占空比,随着adc_val…...
Browser Use的安装和使用
文章目录 一、介绍二、安装教程1、使用Conda创建虚拟环境2、激活环境3、安装browser use4、安装Playwright5、克隆git仓库6、安装项目的依赖 三、使用教程1、启动WebUI2、案例13、案例2 一、介绍 背景 Browser Use:用AI控制你的浏览器,你可以使用它帮你…...
碰一碰发视频saas系统技术源头一站式开发文档
碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下,如何让视频分享更便捷、高效,成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势,为视频分享领域带来了革命性变革。…...
Spring Boot 静态访问配置属性的解决方案
前言 在Spring Boot开发中,静态访问配置信息是一个常见需求,尤其是在工具类、常量类或非Bean类中直接获取配置值。 问题背景 假设我们的应用需要从application.yml中读取配置项app.logotype,并在工具类、静态方法或非Bean类中直接访问该值。…...
NLP高频面试题(四)——BN和LN的区别与联系,为什么attention要用LN
在深度学习模型中,Normalization是一种极为重要的技巧,Batch Normalization(BN)和Layer Normalization(LN)是其中最为常用的两种方法。然而,二者在实际应用中有着明显的区别与联系,尤…...
深度学习定义与分类【详细易懂 初学者友好~】
深度学习(Deep Learning)是机器学习的一个子领域,它基于人工神经网络(Artificial Neural Networks,ANN)的理论和架构,通过构建多层(即“深度”)的神经网络结构来学习数据…...
二、小白学JAVA-认识数据类型【变量】
1、实际案例类比 初中以上数学,就知道有有理数、正数、负数、0、小数、大写的数字、语文。 2、数据类型介绍 public class Main {public static void main(String[] args) {// 数据类型byte i_byte 12; // 标识数据范围小,但是节省内存>网络传输…...
UNI-APP uts插件 支持ANDROID 监听手机状态
插件地址 https://ext.dcloud.net.cn/plugin?id22646 模块 import {startPhoneListener,stopPhoneListener,checkIsAutoRecord,toCallAutoRecorderPage,navigateToCallRecordingSettings,jumpToPermissionPage,makePhoneCall,allRecorderFilesAction,registerSmsReceiver,} f…...
AI入门7:python三种API方式调用本地Ollama+DeepSeek
回顾 书接上篇:各种方式搭建了本地知识库: AI入门:AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2:本地AI部署,用ollama部署deepseek(私有化部署)-CSDN博客 AI入门3:给本地d…...