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

STL?list!!!

一、引言

        之前我们一起完成了STL库中的vector,本期我们将一起完成list这一容器,在本期学习中,我们会更加加深对于模板的认识,让我们更加能感受到模板的魅力!

二、list的介绍与相关接口

        list是STL库中提供的一个链表容器,它是一个带头双向循环链表,事实上它的结构比较复杂,但是接口的实现相对简单,在实现该容器时,我们的重点将是如何正确、高效的使用模板的相关知识来简化代码、提升代码可读性

        在本文接下来的部分会介绍list的常用接口,事实上借助这些接口就可以解决平常所能遇到的大部分问题,如果还需要了解list提供的更多接口及使用方法的话,可以跳转到以下网页:

        list - C++ Reference

三、手撕一个list

        1、list的基本框架及其成员变量

        list是一个带头双向循环链表,对于list本身来讲我们只需要一个指向哨兵位的指针就可以管理整个链表,但是对于一个链表来说,我们还需要一个一个的节点来存储相关的数据,所以我们首先需要定义两个类,一个类用来管理链表的相关方法,另一个类用来管理一个一个的节点:
        

        在上面我已经完成了list_node的构造函数,在后面使用时我们只需要传给它一个T对象,它就可以帮助我们构造出一个节点

        2、构造函数

        库中的函数头:
        

        在这里说明一下,alloc是一个内存池,上面的缺省参数是STL库中提供的一个内存池,正常情况下是够用的,在以后的内容中我们会实现一个内存池,当下我们先忽略掉这个部分

        同时,构造函数还有其它重载,有的在这里不实现,在后面的插入函数实现之后我们通过复用来实现,有的不做实现

        对于一个带头双向循环链表来说,它天生一定不为空,在最开始的时候就一定、有一个哨兵位,同时该哨兵位的向前指针和向后指针都指向自己,天然的是一个双向循环链表:
        

        3、头插与尾插


                (1).头插函数:在链表的哨兵位之后插入一个节点

                库中的函数头:

                

                在实现插入相关函数的时候,一定要注意指针变向的顺序:
                

                (2).尾插函数:在链表的末尾,也就是哨兵位之前插入一个节点

                库中的函数头:
                

                实现:

                

        4、构造函数

        库中的函数头:
        

        在实现了插入函数之后,我们就可以实现上面使用n个T对象构造链表的构造函数了:
        

        5、拷贝构造函数

        库中的函数头:
        

        实现该函数,我们可以直接复用之前实现过的插入相关函数,直接对一个新对象不断尾插即可:
        

        6、交换函数

        库中的函数头:
        

        实现该函数可以借用一下算法库中实现的swap函数实现深层次的交换:
        

        7、赋值运算符重载

        库中的函数头:

        

        实现:
        

         对于赋值运算符重载,我们复用了上面的swap函数,同时我们的实现与库中的实现略有差异,在传参时我们采用了传值传参,这时候形参是实参的拷贝,调用我们刚才实现过的拷贝构造函数实现深拷贝,接着将*this与形参x交换,最后借助析构函数(后文会实现)对形参完成释放

        8、迭代器的实现及相关运算符重载和迭代器相关函数

                (1).迭代器类的定义

                list是一个带头双向循环链表,在物理结构上数据与数据之间并不是连续的,对于平常的指针来讲,我们不能通过++、--等运算符直接跳到下一个数据的位置,所以对于list来讲我们不能直接使用指针来充当迭代器,但是很显然Node*类型的指针是实现迭代器的最佳选择,所以我们要封装这个指针,从而让它来充当迭代器,由于C++中并不喜欢使用内部类来实现类内定义类型,所以我们采用封装一个迭代器类同时在list类中实现typedef,接下来我们一起完成这样一个迭代器类:

        

	template <class T>struct list_iterator{typedef list_node<T> Node;//成员变量Node* _node;//构造函数list_iterator(Node* node):_node(node){}//运算符重载//前置++list_iterator<T>& operator++(){_node = _node->_next;return *this;}//后置++list_iterator<T> operator++(int){list_iterator tmp = *this;_node = _node->_next;return tmp;}//前置--list_iterator<T>& operator--(){_node = _node->_front;return *this;}//后置--list_iterator<T> operator--(int){list_iterator tmp = *this;_node = _node->_front;return tmp;}//+操作符重载list_iterator<T> operator+(int x){list_iterator tmp = *this;while (x--){tmp++;}return tmp;}//-操作符重载size_t operator-(list_iterator<T> it){size_t ret = 0;while (it._node != _node){ret++;it._node = it._node->_next;}return ret;}

                对于正常的使用来说,上面的迭代器类已经可以正常的跑通范围for了,但是,接下来的问题是,我们怎么样定义出const_iterator呢?显然的方法是将上面的类复制以下,将‘*’操作符的重载返回值改变以下,再将‘->’操作符重载的返回值改变以下即可,但是对于两个如此相像的类,我们如果采用这样的方法代码复用率过低,这时候我们便可以想到使用模板的知识,在类模板参数部分多给几个参数:

        

template <class T, class Ref, class Ptr>
struct list_iterator
{typedef list_node<T> Node;//成员变量Node* _node;//构造函数list_iterator(Node* node):_node(node){}//运算符重载//前置++list_iterator<T, Ref, Ptr>& operator++(){_node = _node->_next;return *this;}//后置++list_iterator<T, Ref, Ptr> operator++(int){list_iterator tmp = *this;_node = _node->_next;return tmp;}//前置--list_iterator<T, Ref, Ptr>& operator--(){_node = _node->_front;return *this;}//后置--list_iterator<T, Ref, Ptr> operator--(int){list_iterator tmp = *this;_node = _node->_front;return tmp;}//+操作符重载list_iterator<T, Ref, Ptr> operator+(int x){list_iterator tmp = *this;while (x--){tmp++;}return tmp;}//-操作符重载size_t operator-(list_iterator<T, Ref, Ptr> it){size_t ret = 0;while (it._node != _node){ret++;it._node = it._node->_next;}return ret;}//!=操作符重载bool operator!=(list_iterator<T, Ref, Ptr> it){return it._node != _node;}//==操作符重载bool operator==(list_iterator<T, Ref, Ptr> it){return it._node == _node;}//*操作符重载Ref operator*(){return _node->_val;}//->操作符重载Ptr operator->(){return &_node->_val;}
};

                在定义完成上面的迭代器类之后,我们只需要在list类中再将两种迭代器分别进行typedef即可:

        

typedef list_iterator<T,T*,T&> iterator;
typedef list_iterator<T, const T*,const T&> const_iterator;
                (2).迭代器相关函数

                

//迭代器相关函数
iterator begin()
{return head->_next;
}
iterator end()
{return head;
}
const_iterator begin() const
{return head->_next;
}
const_iterator end() const
{return head;
}

        9、在指定位置插入函数--insert

        库中的函数头:
        

        insert函数可以在pos之前位置插入val:
        

        10、将指定位置的元素删除--erase

        库中的函数头:
        

        erase函数可以将pos位置的元素删除:
        

        11、将链表中的元素清空--clear

        库中的函数头:
        

        clear函数可以将链表中的元素清空:
        

        12、析构函数

        由于析构函数的特殊性,在这里就不再展示库中的函数头:
        

四、list

        下面就是我们今天实现的list了:
        

namespace bea
{template <class T>struct list_node{//成员函数//构造函数list_node(const T& val = T()):_val(val),_front(nullptr),_next(nullptr){}//成员变量list_node* _front;list_node* _next;T _val;};template <class T, class Ref, class Ptr>struct list_iterator{typedef list_node<T> Node;//成员变量Node* _node;//构造函数list_iterator(Node* node):_node(node){}//运算符重载//前置++list_iterator<T, Ref, Ptr>& operator++(){_node = _node->_next;return *this;}//后置++list_iterator<T, Ref, Ptr> operator++(int){list_iterator tmp = *this;_node = _node->_next;return tmp;}//前置--list_iterator<T, Ref, Ptr>& operator--(){_node = _node->_front;return *this;}//后置--list_iterator<T, Ref, Ptr> operator--(int){list_iterator tmp = *this;_node = _node->_front;return tmp;}//+操作符重载list_iterator<T, Ref, Ptr> operator+(int x){list_iterator tmp = *this;while (x--){tmp++;}return tmp;}//-操作符重载size_t operator-(list_iterator<T, Ref, Ptr> it){size_t ret = 0;while (it._node != _node){ret++;it._node = it._node->_next;}return ret;}//!=操作符重载bool operator!=(list_iterator<T, Ref, Ptr> it){return it._node != _node;}//==操作符重载bool operator==(list_iterator<T, Ref, Ptr> it){return it._node == _node;}//*操作符重载Ref operator*(){return _node->_val;}//->操作符重载Ptr operator->(){return &_node->_val;}};template <class T>class list{typedef list_node<T> Node;//成员函数public:typedef list_iterator<T,T&,T*> iterator;typedef list_iterator<T, const T&,const T*> const_iterator;//迭代器相关函数iterator begin(){return head->_next;}iterator end(){return head;}const_iterator begin() const{return head->_next;}const_iterator end() const{return head;}//构造函数//空构造explicit list(){head = new Node;head->_front = head;head->_next = head;}//用n个对象构造explicit list(size_t n, const T& val = T()){if (head == nullptr){head = new Node;head->_front = head;head->_next = head;}int ntmp = n;while (ntmp--){push_back(val);}}//拷贝构造函数list(const list& x){Node* cur = x.head->_next;while (cur != x.head){if (head == nullptr){head = new Node;head->_front = head;head->_next = head;}push_back(cur->_val);cur = cur->_next;}}//头插函数void push_front(const T& val){Node* newnode = new Node(val);newnode->_front = head;newnode->_next = head->_next;head->_next = newnode;newnode->_next->_front = newnode;}//尾插函数void push_back(const T& val){Node* newnode = new Node(val);newnode->_next = head;newnode->_front = head->_front;head->_front = newnode;newnode->_front->_next = newnode;}//insert函数iterator insert(iterator pos, const T& val){Node* x = pos._node;Node* newnode = new Node(val);newnode->_front = x->_front;newnode->_next = x;x->_front = newnode;newnode->_front->_next = newnode;return (iterator)newnode;}//erase函数iterator erase(iterator pos){Node* eaim = pos._node;Node* ret = eaim->_next;eaim->_next->_front = eaim->_front;eaim->_front->_next = eaim->_next;delete eaim;return ret;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}//交换函数void swap(list& x){std::swap(x.head, head);}//赋值运算符重载list& operator=(const list x){swap(x);return *this;}//打印函数void Print(){Node* cur = head->_next;cout << "head->";while (cur != head){cout << cur->_val << "->";cur = cur->_next;}cout << "head" << endl;}//析构函数~list(){clear();delete head;}//成员变量private:Node* head;};
}

五、结语

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

        

相关文章:

STL?list!!!

一、引言 之前我们一起完成了STL库中的vector&#xff0c;本期我们将一起完成list这一容器&#xff0c;在本期学习中&#xff0c;我们会更加加深对于模板的认识&#xff0c;让我们更加能感受到模板的魅力&#xff01; 二、list的介绍与相关接口 list是STL库中提供的一个链表容…...

2025.05.14华为机考笔试题-第一题-100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 优先级任务调度系统 问题描述 LYA公司的开发团队正在设计一个智能任务调度系统。该系统需要根据任务优先级动态调整执行顺序,以提高团队工作效率。系统需要支持以下三种操作:…...

紫外相机工作原理及可应用范围

紫外相机是一种利用紫外线&#xff08;UV&#xff09;波段进行成像的设备&#xff0c;紫外线可用于机器视觉应用中&#xff0c;以检测使用可见光无法检测到的特征&#xff0c;工业上使用最常见的紫外波长是365nm和395nm。紫外相机通常用于高分辨率视频显微镜、电晕检测、半导体…...

海外短剧H5/App开源系统搭建指南:多语言+国际支付+极速部署

在全球短视频与短剧内容消费热潮下&#xff0c;搭建一个支持多语言、集成国际支付且能快速部署的海外短剧平台&#xff0c;已成为内容创作者和运营者的核心需求。本文将结合行业前沿技术与开源方案&#xff0c;提供一套完整的系统搭建指南&#xff0c;助您高效实现全球化布局 …...

AWS EC2 微服务 金丝雀发布(Canary Release)方案

为什么需要实现金丝雀发布? 在当前项目的工程实践中, 已经有了充分的单元测试, 预发布环境测试, 但是还是会在线上环境出现非预期的情况, 导致线上事故, 因此, 为了提升服务质量, 需要线上能够有一个预验证的机制. 如何实现金丝雀发布? 使用AWS code deploy方案 AWS code…...

2025年5月华为H12-821新增题库带解析

IS-IS核心知识 四台路由器运行IS-IS且已经建立邻接关系&#xff0c;区域号和路由器的等级如图中标记&#xff0c;下列说法中正确的有? R2和R3都会产生ATT置位的Level-1的LSPR1没有R4产生的LSP&#xff0c;因此R1只通过缺省路由和R4通信R2和R3都会产生ATT置位的Leve1-2的LSPR2和…...

从单体架构到微服务:架构演进之路

引言&#xff1a;当“大货车”遇上“集装箱运输” 在软件开发领域&#xff0c;单体架构曾像一辆载满货物的大货车&#xff0c;将所有功能打包在一个应用中。但随着业务复杂度飙升&#xff0c;这辆“大货车”逐渐陷入泥潭&#xff1a;启动慢如蜗牛、故障波及全局、升级如履薄冰……...

从 Excel 到 Data.olllo:数据分析师的提效之路

背景&#xff1a;Excel 的能力边界 对许多数据分析师而言&#xff0c;Excel 是入门数据处理的第一工具。然而&#xff0c;随着业务数据量的增长&#xff0c;Excel 的一些固有限制逐渐显现&#xff1a; 操作容易出错&#xff0c;难以审计&#xff1b; 打开或操作百万行数据时&…...

Uniapp开发鸿蒙购物项目教程之样式选择器

大家好&#xff0c;今天依然为大家带来鸿蒙跨平台开发教程的分享&#xff0c;我们本系列的教程最终要做一个购物应用&#xff0c;通过这个项目为大家分享uniapp开发鸿蒙应用从配置开发环境到应用打包上架的完成过程。 昨天的文章实现了应用首页的轮播图&#xff0c;其中涉及到…...

AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命

一、四维立体监控网络技术架构 1. 人员行为监控 - 融合人脸识别、骨骼追踪与RFID工牌技术&#xff0c;身份识别准确率99.97% - 支持15米超距夜间红外监控&#xff08;精度0.01lux&#xff09; 2. 作业过程监控 - UWB厘米级定位技术&#xff08;误差&#xff1c;0.3米&…...

协作赋能-1-制造业生产流程重构

制造业生产流程重构——从“信息孤岛”到“全链协同” 在制造业的数字化转型浪潮中&#xff0c;一个看似矛盾的现象正在蔓延&#xff1a;企业部署了ERP、MES、PLM等管理系统&#xff0c;却仍未摆脱“纸质工单满天飞、跨部门扯皮不断”的困境。以汽车制造业为例&#xff0c;其…...

游戏行业DDoS攻击类型及防御分析

游戏行业作为DDoS攻击的高发领域&#xff0c;攻击类型复杂多样&#xff0c;结合多个来源的信息&#xff0c;以下是其主要攻击类型及特征分析&#xff1a; 1. 传统流量型DDoS攻击 UDP洪水攻击&#xff1a;通过大量UDP报文淹没服务器端口&#xff0c;消耗带宽资源&#xff0c;导…...

嵌入式学习的第二十一天-数据结构-双向链表

一、双向链表 1.定义 双向链表是在单链表的每个结点中&#xff0c;再设置一个指向其钱去节点的指针域。 typedef struct DulNode {ElemType date;struct DulNode *pri;//直接前驱指针sturct DulNode *next&#xff1b;//直接后继指针 }DulNode,*DuLinkList;2.双向链表的创建 …...

Python爬虫第21节- 基础图形验证码识别实战

目录 前言 一、学习目标 二、环境准备 2.1 安装依赖 2.2 验证安装 三、获取验证码图片 3.1 常见获取方式 3.2 图片格式要求 四、基础识别流程 4.1 基础流程 4.2 常见问题及解决方案 五、 图像预处理提升识别率 5.1 灰度化 5.2 二值化 5.3 自定义阈值二值化 5.4…...

【React全栈进阶】从组件设计到性能优化实战指南

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

基于EFISH-SCB-RK3576/SAIL-RK3576的消防机器人控制器技术方案‌

&#xff08;国产化替代J1900的应急救援智能化解决方案&#xff09; 一、硬件架构设计‌ ‌极端环境防护系统‌ ‌防爆耐高温设计‌&#xff1a; 采用陶瓷纤维复合装甲&#xff08;耐温1200℃持续1小时&#xff09;&#xff0c;通过GB 26784-2023消防设备防爆认证IP68防护等级…...

插件双更新:LeetCode 刷题支持正式上线,JetBrains IDE 插件持续升级!

为了让更多开发者在真实开发与算法练习中体验 MoonBit 的高效表达与编译性能&#xff0c;MoonBit 语言现已实现对 JetBrains 开发环境与 LeetCode 答题平台的全面支持&#xff01; 无论你是习惯用 IDE 编写项目的开发者&#xff0c;还是希望通过 LeetCode 刷题提升算法能力的程…...

编译OpenSSL时报错,Can‘t locate IPC/Cmd.pm in @INC perl环境

Unix / Linux / macOS $ ./Configure $ make $ make test1、make Can‘t locate IPC/Cmd.pm in INC [ Downloads ] - /source/index.html https://www.openssl.org/source/ yum -y install perl-IPC-Cmd 2.make test Can’t locate Test/More.pm in INC perl环境 yum -…...

新型智慧园区技术架构深度解析:数字孪生与零碳科技的融合实践

&#x1f3ed;在杭州亚运村零碳园区&#xff0c;光伏板与氢燃料大巴构成的能源网络&#xff0c;正通过数字孪生技术实现智能调度。这不仅是格力电器与龙源电力在新能源领域的创新实践&#xff0c;更是智慧园区4.0时代的标杆案例。当AI算法开始接管能源调度&#xff0c;当BIM建模…...

2025全网首发:ComfyUI整合GPT-Image-1完全指南 - 8步实现AI图像创作革命

ComfyUI整合GPT-Image-1完全指南&#xff1a;8步实现AI图像创作革命【2025最新】 OpenAI最新发布的GPT-Image-1模型&#xff08;也就是ChatGPT-4o背后的图像生成技术&#xff09;已经通过API开放使用&#xff0c;而令人惊喜的是&#xff0c;ComfyUI已经第一时间提供了完整支持&…...

AWS Elastic Beanstalk控制台部署Spring极简工程

问题 上次通过EB CLI工具没有成功在AWS中国云部署成功&#xff0c;这次通过EB web控制台来部署。 步骤 接着上次部署失败的Spring工程&#xff1a;AWS Elastic Beanstalk部署极简Spring工程&#xff08;EB CLI失败版&#xff09;&#xff0c;准备好jar文件。 创建ec2私钥文…...

力扣-236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…...

LeetCode 3337.字符串转换后的长度 II:矩阵快速幂(也没有想象中的那么高级啦)

【LetMeFly】3337.字符串转换后的长度 II&#xff1a;矩阵快速幂(也没有想象中的那么高级啦) 力扣题目链接&#xff1a;https://leetcode.cn/problems/total-characters-in-string-after-transformations-ii/ 给你一个由小写英文字母组成的字符串 s&#xff0c;一个整数 t 表…...

【iOS】源码阅读(四)——isa与类关联的原理

文章目录 前言OC对象本质探索clang探索对象本质objc_setProperty源码探索 cls与类的关联原理为什么说bits与cls为互斥关系isa的类型isa_t原理探索isa与类的关联 总结 前言 本篇文章主要是笔者在学习和理解类与isa的关联关系时所写的笔记。 OC对象本质探索 在学习和理解类与isa…...

elementUI 循环出来的表单,怎么做表单校验?

数据结构如下&#xff1a; diversionParamList: [ { length: null, positionNumber: null, value: null, } ] 思路&#xff1a;可根据 index 动态绑定 :props 属性值&#xff0c;校验规则写在:rules <div class"config-item" v-for"(item, index) in form.…...

蓝桥杯11届国B 约数

题目描述 定义阶乘 n!123⋅⋅⋅n。 请问 100! &#xff08;100 的阶乘&#xff09;有多少个正约数 100! 是所有从 1 到 100 的数的乘积&#xff0c;因此&#xff1a; 质数 j 在 100! 中的总指数 质数 j 在 1 中的指数 质数 j 在 2 中的指数 ... 质数 j 在 100 中的指数 …...

【iOS】alloc的实际流程

目录 前言 为什么不按源码流程调用&#xff1f; alloc的调用流程 前言 在之前的博客中我们有学习到过alloc的底层原理&#xff0c;沿着源码一步步找到了alloc的调用链——alloc—>_objc_rootAlloc—>callAlloc—>_objc_rootAllocWithZone—>_class_createInstan…...

Maven clean 提示文件 java.io.IOException

Maven clean 提示文件 java.io.IOException 问题背景问题分析&处理问题总结 问题背景 今天在一个功能开发结束之后&#xff0c;准备通过Maven实现打包操作&#xff0c;然后打包完成后部署到测试环境进行测试。在IDEA开发工具&#xff0c;点击 clean 时提示 Failed to dele…...

QT 使用QPdfWriter和QPainter绘制PDF文件

QT如何生产pdf文件&#xff0c;网上有许多文章介绍&#xff0c;我也是看了网上的文章&#xff0c;看他们的代码&#xff0c;自己琢磨琢磨&#xff0c;才有了本编博客&#xff1b; 其他什么就不详细说了&#xff0c;本篇博客介绍的QPdfWriter和QPainter绘制PDF文件&#xff1b;…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- Manus技术解密

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs- Manus技术解密 如果你从应用程序的角度讲&#xff0c;但是如果我们从模型的角度讲&#xff0c;我们必须让模型既具有这种思考的能力&#xff0c;也具有产出这种最佳的action的这种能力。而且…...

网络安全-等级保护(等保) 2-4 GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》-2019-05-10发布【现行】

################################################################################ 等级确定之后&#xff0c;需要根据不同的安全等级满足相关建设要求&#xff0c;《等级保护基础要求》明确了安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管…...

Ansys Zemax | 在 MATLAB 或 Python 中使用 ZOS-API 进行光线追迹的批次处理

附件下载 联系工作人员获取附件 这篇文章会说明如何在 MATLAB 或 Python 中以 Zemax OpticStudio 应用程式界面 (ZOS-API)处理光线数据库(Ray Database, ZRD)档案&#xff0c;过程中我们将使用ZRDLoader.dll。本文提供了在 Matlab 中批次处理序列光线追迹(一般、归一化、偏振…...

多链互操作性标准解析:构建下一代区块链互联生态

引言 在区块链技术快速演进的今天&#xff0c;“多链宇宙”已成为不可逆的趋势。然而&#xff0c;链与链之间的孤立性导致流动性割裂、开发成本高昂和用户体验碎片化。互操作性标准的制定&#xff0c;正是打破这一僵局的核心钥匙。本文将深入探讨主流互操作性协议的技术架构、…...

openEuler24.03 LTS下安装MySQL8.0.42

目录 前提步骤 删除原有mysql及maridb数据库 安装MySQL 启动MySQL 启动查看MySQL状态 设置MySQL开机自启动 查看登录密码 登录MySQL 修改密码及支持远程连接 远程连接MySQL 前提步骤 拥有openEuler24.03 LTS环境&#xff0c;可参考&#xff1a;Vmware下安装openEule…...

React 轻量级富文本编辑器推荐(中文版)

以下是几款适合集成到 React 项目中的轻量级富文本编辑器&#xff0c;特别针对中文用户优化推荐&#xff1a; 超轻量级选择&#xff08;小于100KB&#xff09; 1. react-simplemde-editor&#xff08;Markdown编辑器&#xff09; 特点&#xff1a;专为 Markdown 设计&#xf…...

React 第四十一节Router 中 useActionData 使用方法案例以及注意事项

一、useActionData前言 useActionData 是 React Router 提供的一个钩子函数&#xff0c;用于获取在路由的 action 函数中返回的数据。它通常与表单提交&#xff08;通过 <Form> 组件&#xff09;配合使用&#xff0c;用于处理表单提交后的服务器响应数据&#xff08;如错…...

西门子 Teamcenter13 Eclipse RCP 开发 1 工具栏

西门子 Teamcenter13 Eclipse RCP 开发 1 工具栏 1 配置文件2 插件控制3 命令框架 1 配置文件 在 Teamcenter 13 Eclipse RCP 开发中&#xff0c;plugin.xml 是插件的核心配置文件&#xff0c;定义了插件的&#xff1a; 1、唯一身份&#xff08;ID、版本&#xff09;。 2、所…...

【python实用小脚本-63】每天花费2小时修复黑白照片,Python一键转换,节省90%时间(建议收藏)

一、应用场景故事 上周&#xff0c;我的朋友小李从家里翻出了一堆老照片&#xff0c;这些照片大多是彩色的&#xff0c;但他想把它们转换成黑白风格&#xff0c;让照片更有复古感。他尝试用Photoshop一张张处理&#xff0c;但花了整整一个周末&#xff0c;才处理了不到一半的照…...

R语言的专业网站top5推荐

李升伟 以下是学习R语言的五个顶级专业网站推荐&#xff0c;涵盖教程、社区、资源库和最新动态&#xff1a; 1.R项目官网 (r-project.org) R语言的官方网站&#xff0c;提供软件下载、文档、手册和常见问题解答。特别适合初学者和高级用户&#xff0c;是获取R语言核心资源的…...

Apache JMeter API 接口压测技术指南

文章目录 前言技术积累JMeter 简介适用场景JMeter 核心组件 安装与配置线程组压测逐步加压压测安装相应jmeter 插件创建测试计划生成压测HTML 总结 前言 Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于对 Web 应用、API 接口、数据库等进行负载和压力测试。本指…...

【Java实战】IO流(转换流,打印流,数据流,序列化流)

引出问题 不同编码读取出现的乱码问题 如果是代码编码被读取的文本文件的编码是一致的&#xff0c;使用字符流读取文本文件时不会出现乱码&#xff1b; 如果不一致&#xff0c;使用字符流读取文本文件就会出现乱码。 public class BufferedReader{ public static void main(S…...

Python课程及开源项目推荐

Python课程及开源项目推荐 摘要&#xff1a;学习 Python 是一个非常好的选择&#xff0c;因为它是一种功能强大且易于上手的编程语言&#xff0c;广泛应用于数据分析、数据可视化、机器学习、网络爬虫等领域。以下是针对 Coursera 上 Python 课程和专业证书的推荐&#xff0c;以…...

内网互通原则详解!

目录 前言1. 路由 (Routing): 谁去哪儿找谁&#xff1f;&#x1f5fa;️2. 防火墙与安全组 (Firewalls & Security Groups): 门卫大爷和保安系统&#xff01;&#x1f46e;‍♂️&#x1f6aa;3. 内网 DNS (Internal DNS): 小区的通讯录/电话本&#xff01;&#x1f4d2;&a…...

[Harmony]大文件持久化

1.添加权限 在module.json5文件中添加权限 "requestPermissions": [{"name": "ohos.permission.READ_WRITE_USER_FILE", // 读写用户数据"reason": "$string:read_write_user_file_reason","usedScene": {"…...

C 语言实战:使用二维数组进行学生成绩统计与分析

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在处理表格型数据时,二维数组是 C 语言中一种非常直观且强大的工具。学生成绩单就是一个典型的二维数据:每一行代表一个学生,每一列代表一门科目。本文将通过一个具体的案例,演示如何利用二维数组来存…...

[学习]RTKLib详解:tle.c(系列终章)

本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解&#xff1a;pntpos.c与postpos.c [学习]RTKLib详解&…...

体重秤出口日本的计量认证介绍,体脂秤出口日本“正”认证介绍

什么是家庭专用测量仪器&#xff1f; 家庭专用测量仪器是一种非自动秤&#xff0c;主要用于普通消费者的日常生活&#xff0c;并且刻度为10 mg或更大&#xff0c;并且秤号的刻度为100或更大&#xff0c;满足以下条件的&#xff1a; 通用秤 是一种非自动秤&#xff0c;重量超过…...

【hadoop】Flume的相关介绍

1 概述 Flume是Cloudera开发的一个分布式的、可靠的、高可用的系统&#xff0c;它能够将不同数据源的海量日志数据进行高效收集、聚合、移动&#xff0c;最后存储到一个中心化的数据存储系统中。随着互联网的发展&#xff0c;特别是移动互联网的兴起&#xff0c;产生了海量的用…...

图片、音频、视频都能转?简鹿格式工厂了解一下

我们每天都会接触到各种各样的音视频和图片文件。无论是拍摄的照片、录制的视频&#xff0c;还是下载的音频资源&#xff0c;它们往往以不同的格式存在——有些适合分享&#xff0c;有些适合编辑&#xff0c;而有些则仅限特定设备或平台使用。格式不统一的问题&#xff0c;正在…...

doris节点数量规划

1.FE 节点数量​ FE 节点主要负责用户请求的接入、查询解析规划、元数据管理及节点管理等工作。 对于生产集群&#xff0c;一般建议部署至少 3 个节点的 FE 以实现高可用环境。FE 节点分为以下两种角色&#xff1a; Follower 节点&#xff1a;参与选举操作&#xff0c…...