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

c++STL-list的模拟实现

c++STL-list的模拟实现

  • list源码剖析
  • list模拟实现
    • list构造函数
    • 拷贝构造函数
    • 赋值重载
    • 迭代器 iterator
    • 访问结点数size和判空
    • 尾插 push_back
    • 头插 push_front
    • 尾删pop_back
    • 头删pop_front
    • 插入 insert
    • 删除 erase
    • 清空clear和析构函数
    • 访问结点
  • 参考程序

list源码剖析

建议先看c++STL-list的使用和迭代器-CSDN博客。

STL中某版本的list的结点原型:

template <class T>
struct __list_node{typedef void* void_pointer;void_pointer next;voie_pointer prev;T data;
}

void 后期还需要强转。

定义结点用struct,可以换成class,但要另一个类将这个类封装成友元,因为class默认私有。

__list_node__表示内部的实现,算是项目上的约定。

之后list类的成员:

template <class T, class Alloc = alloc>
class list {
protected:typedef void* void_pointer;//结点类型typedef __list_node<T> list_node;//空间配置器typedef simple_alloc<list_node, Alloc> list_node_allocator;
public://类型typedef T value_type;//类型指针typedef value_type* pointer;typedef const value_type* const_pointer;//类型引用typedef value_type& reference;typedef const value_type& const_reference;typedef list_node* link_type;//结点数和引用数typedef size_t size_type;typedef ptrdiff_t difference_type;//迭代器typedef __list_iterator<T, T&, T*>             iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;//...
protected:link_type node;
}

看代码(容器)先看构造函数,初始化决定初始结构是什么样的。

template<class T>
class list {list() { empty_initialize(); }//空结点初始化//证明链表在生成时会先//生成哨兵卫结点void empty_initialize() {node = get_node();node->next = node;node->prev = node;}link_type get_node() { return list_node_allocator::allocate(); }link_type create_node(const T& x) {link_type p = get_node();__STL_TRY{//调用定位newconstruct(&p->data, x);}__STL_UNWIND(put_node(p));return p;}void put_node(link_type p) { list_node_allocator::deallocate(p); }iterator begin() { return (link_type)((*node).next); }iterator end() { return node; }
};

allocate是空间配置器,也就是说get_node是获取一个新的结点。

list的迭代器功能比stringvector复杂,因此库里的list将迭代器封装成了一个类,通过模板参数的不同来区分不同类型的迭代器。

//Ref,即reference,引用
//Ptr,即pointer,指针
//表示引用类型和指针类型也作为模板参数的一部分
template<class T, class Ref, class Ptr>
struct __list_iterator {typedef __list_iterator<T, T&, T*>             iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef __list_iterator<T, Ref, Ptr>           self;typedef bidirectional_iterator_tag iterator_category;typedef T value_type;typedef Ptr pointer;typedef Ref reference;typedef __list_node<T>* link_type;typedef size_t size_type;typedef ptrdiff_t difference_type;link_type node;__list_iterator(link_type x) : node(x) {}__list_iterator() {}__list_iterator(const iterator& x) : node(x.node) {}bool operator==(const self& x) const { return node == x.node; }bool operator!=(const self& x) const { return node != x.node; }reference operator*() const { return (*node).data; }#ifndef __SGI_STL_NO_ARROW_OPERATORpointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */self& operator++() {node = (link_type)((*node).next);return *this;}self operator++(int) {self tmp = *this;++* this;return tmp;}self& operator--() {node = (link_type)((*node).prev);return *this;}self operator--(int) {self tmp = *this;--* this;return tmp;}
};

end()是尾结点的迭代器,begin()end()->next

list模拟实现

list的本质是封装加运算符重载。

因此list由三部分组成:

  1. 结点类__list_node
  2. 迭代器类__list_iterator
  3. 链表本体list

__list_node,考虑到库中的结点给的前驱和后缀都是void*,正式使用时还要强制转换,于是这里尝试做改进:

template<class T>
struct __list_node {//指针域typedef __list_node* pointer;pointer next;pointer view;//数据域T data;
};

为了能做到迭代器重载const修饰和非const修饰的迭代器,参考库中的__list_iterator,需要设计成三个模板参数的类模板,自己改进了看起来比较冗余的部分:

template<class T, class Ref, class Ptr>
struct __list_iterator {typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef __list_iterator<T, Ref, Ptr> self;typedef __list_node<T>* link_node;link_node node;
};

最后是list本体:

class list {
public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef __list_node<T> Node;//...
private:Node* node;
};

list构造函数

构造函数选择这几个常用的实现:

list ();list (size_t n, const T& val = T());template <class InputIterator>list (InputIterator first, InputIterator last);list (const list& x);

默认构造函数用于生成哨兵卫结点。

要使用list (InputIterator first, InputIterator last);,则需要再加上一个
list (int n, const T& val = T());,防止整型被识别成迭代器。

拷贝构造函数

同样可以创造新的头结点,并遍历链表(范围for)进行尾插。

赋值重载

  • 清理链表,保留头结点,之后遍历形参的链表即可。
  • 同样可以交换哨兵卫结点。

迭代器 iterator

迭代器用3个模板参数的模板类封装。

template<class T, class Ref, class Ptr>
struct __list_iterator {typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef __list_iterator<T, Ref, Ptr> self;typedef __list_node<T>* link_node;link_node node;
};

迭代器需要支持的操作:

  1. 构造能指向指定结点的构造函数。
  2. 拷贝构造函数。
  3. 解引用操作*,返回迭代器指向的结点的数据域。要求数据域能读、能写。
  4. 解引用操作->,返回迭代器指向的结点的数据域,当数据域也是自定义类型时,返回指针。
  5. ==,用于判断两个迭代器指向的结点是否相等。
  6. !=,用于判断两个迭代器指向的结点是否不等。
  7. ++,当前迭代器指向后继结点。
  8. --,当前迭代器指向前驱结点。
  9. begin(),返回哨兵卫结点的后一个结点。
  10. end(),返回哨兵卫结点。

访问结点数size和判空

返回除哨兵卫结点外的结点数_size

判断_size是否为0,或哨兵卫的两个指针是否都指向自己。

尾插 push_back

void push_back(const T& val);

end()前插入结点即可。可以另外实现,也可以复用insert

头插 push_front

void push_front(const T& val);

begin()前插入结点即可。可以另外实现,也可以复用insert

尾删pop_back

删除--end()结点即可。

头删pop_front

删除begin()结点即可。

插入 insert

iterator insert(iterator pos, const T& val);

在迭代器pos前插入以val为数据的新结点。
请添加图片描述

这样在end()前插入结点相当于是尾插,在begin()前插入结点相当于是头插。

链表的迭代器不受扩容的影响,不会出现迭代器失效的问题,给不给返回值都可以。这里选择给。

删除 erase

iterator erase(iterator pos);

删除pos迭代器指向的结点。

删除后pos迭代器必定失效,因此需要返回下一个结点的迭代器。

清空clear和析构函数

void clear();

删除除哨兵卫结点外的所有结点。

析构函数在clear的基础上,进一步清理哨兵卫结点。

访问结点

用一个队首front和队尾back访问头、尾结点即可。

需要注意end()在这里设定为哨兵卫结点,一般情况下不可访问。

参考程序

某.h文件:

#pragma once
#include<cassert>namespace mystd {template<class Type>void swap(Type& a, Type& b) {Type tmp = a;a = b;b = tmp;}template<class T>struct __list_node {//指针域typedef __list_node* pointer;pointer next;pointer view;//数据域T data;__list_node(const T& x = T()):data(x), next(nullptr), view(nullptr) {}};//三个模板参数分别为:存储的数据类型//存储的数据的引用、存储的数据空间的地址类型template<class T, class Ref, class Ptr>struct __list_iterator {typedef __list_iterator<T, Ref, Ptr> self;typedef __list_node<T>* link_node;link_node node;__list_iterator<T, Ref, Ptr>(link_node x = nullptr):node(x) {}__list_iterator<T, Ref, Ptr>(const self& x): node(x.node) {}Ref operator*() {return node->data;}//为了支持T为自定义类型的情况//返回迭代器指向的结点的数据域的地址Ptr operator->() {return &node->data;}bool operator==(const self& x) const{return node == x.node;}bool operator!=(const self& x) const {return node != x.node;}self& operator++() {node = node->next;return *this;}self& operator--() {node = node->view;return *this;}self operator++(int) {self tmp(*this);node = node->next;return tmp;}self operator--(int) {self tmp(*this);node = node->view;return tmp;}};template<class T>class list {public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef __list_node<T> Node;//默认构造函数list<T>() {node = get_node();node->next = node->view = node;_size = 0;}//构造函数list<T>(int n, const T& val = T()) {node = get_node();node->next = node->view = node;size_t tmp = n;for (size_t i = 0; i < tmp; i++)push_back(val);}list<T>(size_t n, const T& val = T()) {node = get_node();node->next = node->view = node;size_t tmp = n;for (size_t i = 0; i < tmp; i++)push_back(val);}template<class Inputiterator>list<T>(Inputiterator first, Inputiterator second) {node = get_node();node->next = node->view = node;while (first != second) {push_back(*first);first++;}}//拷贝构造函数list<T>(const list<T>& obj) {node = get_node();node->next = node->view = node;for (const auto& x : obj)this->push_back(x);}//赋值重载list<T>& operator=(list<T>obj) {mystd::swap(this->node, obj.node);mystd::swap(this->_size, obj._size);return *this;}//析构函数~list() {clear();delete node;}//迭代器iterator begin() {return iterator(node->next);}iterator end() {return iterator(node);}const_iterator begin() const {return const_iterator(node->next);}const_iterator end() const {return const_iterator(node);}//结点数size_t size()const {return _size;}//判断是否为空bool empty()const {return this->node->next == this->node&& this->node->view == this->node;}//头插void push_front(const T& val) {insert(begin(), val);}//尾插void push_back(const T& val) {insert(end(), val);}//尾删void pop_back() {erase(--end());}//头删void pop_front() {erase(begin());}//插入iterator insert(iterator pos, const T& val) {Node* cur = pos.node->view;Node* newnode = get_node(val);newnode->next = cur->next;newnode->view = cur;cur->next = newnode;newnode->next->view = newnode;++_size;return iterator(newnode);}//删除iterator erase(iterator pos) {assert(pos != end());Node* del = pos.node, * cur = pos.node->next;del->view->next = del->next;del->next->view = del->view;delete del;--_size;return iterator(cur);}//清空void clear() {auto it = begin();while (it != end()) {it = erase(it);}}//访问T& front() {return node->next->data;}T& back() {return node->view->data;}private:Node* get_node(const T& x = T()) {Node* tmp = new Node(x);tmp->next = tmp->view = nullptr;//这里建议赋值tmpreturn tmp;}template<class Type>friend void mystd::swap(Type&, Type&);Node* node;//哨兵卫size_t _size;//结点数};
}

相关文章:

c++STL-list的模拟实现

cSTL-list的模拟实现 list源码剖析list模拟实现list构造函数拷贝构造函数赋值重载迭代器 iterator访问结点数size和判空尾插 push_back头插 push_front尾删pop_back头删pop_front插入 insert删除 erase清空clear和析构函数访问结点 参考程序 list源码剖析 建议先看cSTL-list的…...

RabbitMQ 核心概念与消息模型深度解析(二)

四、代码实战 了解了 RabbitMQ 的核心概念和消息模型后&#xff0c;接下来我们通过代码实战来进一步加深对它们的理解和掌握。下面将以 Java 和 Spring AMQP 为例&#xff0c;展示如何使用 RabbitMQ 进行消息的发送和接收。 4.1 环境准备 在开始编写代码之前&#xff0c;需要…...

JAVA研发+前后端分离,ZKmall开源商城B2C商城如何保障系统性能?

在电商行业竞争白热化的当下&#xff0c;B2C 商城系统的性能表现成为决定用户留存与商业成败的关键因素。ZKmall 开源商城凭借 Java 研发与前后端分离架构的深度融合&#xff0c;构建起一套高效、稳定且具备强大扩展性的系统架构&#xff0c;从底层技术到上层应用全方位保障性能…...

【android bluetooth 框架分析 02】【Module详解 6】【StorageModule 模块介绍】

1. 背景 我们在 gd_shim_module 介绍章节中&#xff0c;看到 我们将 StorageModule 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<storage::StorageModule>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module 挨个初始化。 而在该函…...

Datawhale 5月llm-universe 第1次笔记

课程地址&#xff1a;GitHub - datawhalechina/llm-universe: 本项目是一个面向小白开发者的大模型应用开发教程&#xff0c;在线阅读地址&#xff1a;https://datawhalechina.github.io/llm-universe/ 难点&#xff1a;配置conda环境变量 我用的vscode github方法 目录 重要…...

Linux架构篇、第五章git2.49.0部署与使用

Linux_架构篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;git2.49.0部署与使用 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.13 适用环境: Centos7 文档说明 这份文档聚焦于在 CentOS 7 环境下部署和…...

南方科技大学Science! 自由基不对称催化新突破 | 乐研试剂

近日&#xff0c;南方科技大学刘心元教授团队联合浙江大学洪鑫教授团队在自由基不对称催化领域取得新进展。课题组开发了一系列大位阻阴离子 N,N,P-配体&#xff0c;用于铜催化未活化外消旋仲烷基碘与亚砜亚胺的不对称胺化反应。该反应表现出广泛的底物兼容性&#xff0c;涵盖具…...

手机换IP真的有用吗?可以干什么?

在当今数字化时代&#xff0c;网络安全和个人隐私保护日益受到重视。手机作为我们日常生活中不可或缺的工具&#xff0c;其网络活动痕迹往往通过IP地址被记录和追踪。那么&#xff0c;手机换IP真的有用吗&#xff1f;它能为我们带来哪些实际好处&#xff1f;本文将为你一一解答…...

【C++详解】类和对象(上)类的定义、实例化、this指针

文章目录 一、类的定义1、类定义格式2、访问限定符3、类域 二、实例化1、实例化概念2、对象大小 三、this指针 一、类的定义 1、类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中…...

C语言—再学习(数据的存储类别)

在c语言中&#xff0c;每个变量和函数都有两个属性&#xff1a;数据类型和数据的存储类别 C的存储类别包括4种&#xff1a;自动挡&#xff08;auto&#xff09;、静态的&#xff08;static&#xff09;、寄存器的&#xff08;register&#xff09;、外部的&#xff08;extern&…...

软考软件评测师——计算机组成与体系结构(分级存储架构)

一、虚拟存储技术 虚拟存储系统通过软硬件协同实现内存扩展&#xff0c;其核心特征包括&#xff1a; 逻辑容量扩展能力&#xff1a;实际物理内存与外存结合&#xff0c;呈现远大于物理内存的连续地址空间动态加载机制&#xff1a;程序运行时仅加载必要部分到内存&#xff0c;…...

需求跟踪矩阵准确性的5大策略

需求跟踪矩阵的准确性可显著提升软件项目质量&#xff0c;确保需求的全面覆盖、减少遗漏和偏差&#xff0c;有利于优化变更管理&#xff0c;降低返工风险&#xff0c;最终保障产品符合用户预期和业务目标。如果不能保证跟踪矩阵的准确性&#xff0c;可能会导致需求遗漏、测试覆…...

【调度算法】MAPF多智能体路径规划问题

参考链接&#xff1a;https://blog.csdn.net/qq_43353179/article/details/129396325 在这篇博客的基础上对一些省略的部分进行补充。 网站&#xff1a;https://mapf.info/ 可行性判断 1. k-鲁棒性&#xff08;k-robust MAPF&#xff09; 在经典 MAPF 中&#xff0c;只要所有…...

迅龙3号基于兆讯MH22D3适配CST328多点触摸驱动开发笔记

MH22D3芯片是兆讯公司新推出的基于cortex-M3内核的新一代芯片&#xff0c;专注于显示应用&#xff0c;其主频高达216Mhz&#xff0c;64KB SRAM&#xff0c;512KB Flash&#xff0c;开发UI应用游刃有余。详细介绍请看&#xff1a;MH22D3新一代显控应用性价比之王 新龙微基于MH22…...

推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略

在 B2C 电商竞争激烈的市场环境中&#xff0c;精准推荐已成为提升用户体验、促进商品销售的关键。ZKmall 模板商城通过推荐算法工程化手段&#xff0c;深度挖掘用户数据价值&#xff0c;制定科学的用户分层推荐策略&#xff0c;实现 “千人千面” 的个性化推荐&#xff0c;帮助…...

你对于JVM底层的理解

JVM&#xff08;Java虚拟机&#xff09;是一个执行Java字节码的虚拟机&#xff0c;负责将Java程序的代码转化为能够在不同操作系统上运行的机器码。为了深入理解JVM的底层工作原理&#xff0c;可以从以下几个方面入手&#xff1a; 1. 类加载机制 JVM的类加载机制是其核心之一…...

深入探讨 Java 性能术语与优化实践

在 Java 开发中,性能优化是确保应用程序高效运行的关键。无论是构建实时处理系统还是大规模分布式服务,理解性能术语和分析方法都至关重要。本文将详细介绍 Java 性能中的核心术语,包括延迟(Latency)、吞吐量(Throughput)、利用率(Utilization)、效率(Efficiency)、…...

简单介绍Qt的属性子系统

深入理解Qt的属性系统 ​ 笔者最近正在大规模的开发Qt的项目和工程&#xff0c;这里笔者需要指出的是&#xff0c;这个玩意在最常规的Qt开发中是相对比较少用的&#xff0c;笔者也只是在Qt的QPropertyAnimation需要动画感知笔者设置的一个属性的时候方才知道这个东西的。因此&…...

【PmHub后端篇】PmHub中基于自定义注解和AOP的服务接口鉴权与内部认证实现

1 引言 在现代软件开发中&#xff0c;尤其是在微服务架构下&#xff0c;服务接口的鉴权和内部认证是保障系统安全的重要环节。本文将详细介绍PmHub中如何利用自定义注解和AOP&#xff08;面向切面编程&#xff09;实现服务接口的鉴权和内部认证&#xff0c;所涉及的技术知识点…...

消息~组件(群聊类型)ConcurrentHashMap发送

为什么选择ConcurrentHashMap&#xff1f; 在开发聊天应用时&#xff0c;我们需要存储和管理大量的聊天消息数据&#xff0c;这些数据会被多个线程频繁访问和修改。比如&#xff0c;当多个用户同时发送消息时&#xff0c;服务端需要同时处理这些消息的存储和查询。如果用普通的…...

掌控随心 - 服务网格的流量管理艺术 (Istio 实例)

掌控随心 - 服务网格的流量管理艺术 (Istio 实例) 想象一下,没有服务网格的时候,我们要实现像“将 1% 的用户流量导入到新版本应用”、“根据用户设备类型访问不同后端”、“模拟下游服务故障”这类高级流量策略,通常需要在代码、负载均衡器、API 网关等多个地方进行复杂且分…...

Github 2025-05-13 Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2025-05-13统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10TypeScript项目1 ComfyUI&#xff1a;强大而模块化的稳定扩散GUI 创建周期&#xff1a;399 天开…...

Spring Boot 自动装配原理详解

Spring Boot 的自动装配&#xff08;Auto-Configuration&#xff09;是其核心特性之一&#xff0c;它极大地简化了 Spring 应用的配置过程。通过自动装配&#xff0c;Spring Boot 能够根据项目中的依赖&#xff08;例如&#xff0c;添加了 Spring Data JPA 依赖后自动配置数据库…...

Python核心数据类型全解析:字符串、列表、元组、字典与集合

导读&#xff1a; Python 是一门功能强大且灵活的编程语言&#xff0c;而其核心数据类型是构建高效程序的基础。本文深入剖析了 Python 的五大核心数据类型——字符串、列表、元组、字典和集合&#xff0c;结合实际应用场景与最佳实践&#xff0c;帮助读者全面掌握这些数据类型…...

索尼(sony)摄像机格式化后mp4的恢复方法

索尼(sony)的Alpha 7 Ⅳ系列绝对称的上是索尼的“全画幅标杆机型”&#xff0c;A7M4配备了3300万像素的CMOS&#xff0c;以及全新研发的全画幅背照式Exmor R™CMOS影像传感器&#xff0c;搭载BIONZ XR™影像处理器&#xff0c;与旗舰微单™Alpha 1如出一辙。下面我们来看看A7M4…...

Kubernetes容器运行时:Containerd vs Docker

Containerd 和 Docker 是容器技术领域的两个核心组件&#xff0c;它们在功能定位、架构设计、性能特点及适用场景上有显著差异。以下是两者的详细对比分析&#xff1a; 一、定位与功能 特性DockerContainerd核心定位完整的容器平台&#xff0c;包含构建、运行、编排等全生命周…...

免费专业级 PDF 处理!SolidPDF OCR 识别 + 精准转换批量处理

各位办公小能手们&#xff01;今天咱来聊聊一款超牛的软件——SolidConverterPDF。这可是个专业的多功能PDF处理工具&#xff0c;啥格式转换、文档编辑、扫描识别&#xff0c;它都能搞定&#xff01;下面我就给大伙详细唠唠它的厉害之处。 先说说它的核心功能。 一是PDF格式转换…...

电子电器架构 --- 区域计算架构(Zonal Compute)备战下一代电子电气架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

API的学习总结(上)

在 Java 中&#xff0c;API 指的是 Java 提供的一系列类、接口、方法和工具&#xff0c;用于开发 Java 应用程序。Java API 是 Java 平台的核心组成部分&#xff0c;它提供了丰富的功能&#xff0c;包括基础数据类型、集合框架、输入输出、网络编程、多线程、数据库连接等。 核…...

Spring Boot之Web服务器的启动流程分析

如何判断创建哪种web容器&#xff1a;servlet&#xff1f;reactive&#xff1f; 我们在启动Spring Boot程序的时候&#xff0c;会使用SpringApplication.run方法来启动&#xff0c;在启动流程中首先要判断的就是需要启动什么类型的服务器&#xff0c;是servlet&#xff1f;或者…...

代码随想录算法训练营第六十三天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天&#xff0c;今天是dijkstra&#xff08;堆优化版&#xff09;以及Bellman_ford &#xff0c;尝试理解中&#xff0c;属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…...

RAG之大规模解析 PDF 文档全流程实战

PDF 文档在商业、学术和政府领域无处不在,蕴含着大量宝贵信息。然而,从 PDF 中提取结构化数据却面临着独特的挑战,尤其是在处理数千甚至数百万个文档时。本指南探讨了大规模解析 PDF 的策略和工具。 PDF解析挑战 PDF 的设计初衷是为了提供一致的视觉呈现,而非数据提取。这…...

uart16550详细说明

一、介绍 uart16550 ip core异步串行通信IP连接高性能的微控制器总线AXI,并为异步串行通信提供了 控制接口。软核设计连接了axilite接口。 二、特性 1.axilite接口用于寄存器访问和数据传输 2.16650串口和16450串口的软件和硬件寄存器都是兼容的 3.默认的core配置参数&#xf…...

Docker 环境安装(2025最新版)

Docker在主流的操作系统和云平台上都可以使用&#xff0c;包括Linux操作 系统&#xff08;如Ubuntu、 Debian、Rocky、Redhat等&#xff09;、MacOS操作系统和 Windows操作系统&#xff0c;以及AWS等云平 台。 Docker官网&#xff1a; https://docs.docker.com/ 配置宿主机网…...

Comparator不满足自反性错误,Comparison method violates its general contract

APP运行退出&#xff0c;跟踪信息 java.lang.IllegalArgumentException: Comparison method violates its general contract! Collections.sort(idxsList);//按score升序排列 查看idxs类 public int compareTo(Idxs o) { //重写compareTo方法 return (int) (this.g…...

[Java实战]Spring Boot 3 整合 Apache Shiro(二十一)

[Java实战]Spring Boot 3 整合 Apache Shiro&#xff08;二十一&#xff09; 引言 在复杂的业务系统中&#xff0c;安全控制&#xff08;认证、授权、加密&#xff09;是核心需求。相比于 Spring Security 的重量级设计&#xff0c;Apache Shiro 凭借其简洁的 API 和灵活的扩…...

如何界定合法收集数据?

首席数据官高鹏律师团队 在当今数字化时代&#xff0c;数据的价值日益凸显&#xff0c;而合法收集数据成为了企业、机构以及各类组织必须严守的关键准则。作为律师&#xff0c;深入理解并准确界定合法收集数据的范畴&#xff0c;对于保障各方权益、维护法律秩序至关重要。 一…...

Flask+HTML+Jquery 文件上传下载

HTML 代码&#xff1a; <div id"loadingIndicator" style"display:none;"><div class"spinner"></div> </div> <!-- 请求过程中转圈圈 --> <form action"" method"post" enctype"m…...

MapReduce打包运行

&#xff08;一&#xff09;maven打包 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff08;例如&#xff1a;jar…...

国产化Word处理控件Spire.Doc教程:如何使用 C# 从 Word 中提取图片

通过编程方式从 Word 文档中提取图片&#xff0c;可以用于自动化文档处理任务。E-iceblue旗下Spire系列产品是国产文档处理领域的优秀产品&#xff0c;支持国产化&#xff0c;帮助企业高效构建文档处理的应用程序。本文将演示如何使用 C# 和 Spire.Doc for .NET 库从 Word 文件…...

07 mysql之DQL

一、什么是DQL DQL 是 SQL 的一部分,专门用于查询数据。核心命令是 SELECT,是最常用的命令,支持: 简单查询条件过滤排序与分页多表连接聚合统计子查询与复杂逻辑二、基础查询语法 SELECT 字段1, 字段2, ... FROM 表名 WHERE 条件表达式 GROUP BY 分组字段 HAVING 分组条件…...

spark-standalone

一、定义&#xff1a;Standalone 模式是一种独立的集群部署模式&#xff0c;自带完整服务&#xff0c;可单独部署到一个集群中&#xff0c;无需依赖任何其他资源管理系统。 二、配置步骤 1.和前面一样拉到hadoop101的/opt/module这个目录里面。 2.压缩 3.重命名为spark-sta…...

运行Spark程序-在shell中运行 --SparkConf 和 SparkContext

SparkConf 类用于配置 Spark 应用程序的各种参数。通过 SparkConf 类&#xff0c;你可以设置应用程序的名称、运行模式&#xff08;如本地模式、集群模式&#xff09;、资源分配&#xff08;如内存、CPU 核心数&#xff09;等。主要作用配置应用程序参数&#xff1a;可以设置 S…...

分割任务 - 数据增强

语义分割 - FCN &#xff1a; 数据预处理/数据增强 算法源码实例 base_size520 crop_size480 flip_prob0.5if train_val train:self.transforms transforms.Compose([transforms.RandomResize(int(base_size*0.5), int(base_size*2)),transforms.RandomHorizontalFlip(flip_…...

基于C#+MySQL实现(WinForm)企业设备使用信息管理系统

企业设备使用信息管理系统 引言 企业的设备管理在企业的生产制造和管理过程之中意义比较重大&#xff0c;明确企业的设备的产权和维护成本对于企业的成本控制和财务管理之中起到了重要的作用。随着市场竞争的加剧&#xff0c;现代企业所处的市场环境发生了深刻的变革&#xf…...

JavaScript异步编程 Async/Await 使用详解:从原理到最佳实践

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…...

Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》

文章目录 1. 引言&#xff1a;为什么相机是 3D 场景的“眼睛”&#xff1f;1.1 相机的核心作用1.2 常见相机类型概览 2. 相机基础参数解析2.1 通用属性2.2 相机坐标系 3. 详解常用相机类型3.1 自由相机&#xff08;FreeCamera&#xff09;3.2 弧形旋转相机&#xff08;ArcRotat…...

MCP Server多节点滚动升级一致性治理

飞书云文档原链接地址&#xff1a;https://ik3te1knhq.feishu.cn/wiki/W8ctwG2sAiPkrXkpl7ocP0g0njf [!TIP] MCP Server 多节点部署时&#xff0c;滚动发布&#xff0c;MCP Client 侧使用的 Client 连接保证使用的是最新的工具配置信息 后续推进&#xff1a;按比例使用旧、新实…...

多线程(二)

今天先来了解一个上一期的遗留概念 —— 前台线程与后台线程 一 . 前台线程与后台线程 大家应该多多少少都听过酒桌文化&#xff0c;咱们平常吃饭&#xff0c;座位次序是没有那么多讲究的&#xff0c;但是在跟领导吃饭&#xff0c;或者出席宴会和一些重要场所的饭局时&#…...

2025年,大模型LLM还有哪些可研究的方向?

近两年LLM在学术界与工业界的发展大家都有目共睹。到了今年&#xff0c;以预训练LLM为代表的大模型PK上半场已然结束&#xff0c;接下来就要进入下半场大模型2.0时代了。 那么在这新赛道&#xff0c;关于大模型我们还有什么可做的创新&#xff1f;要知道&#xff0c;如今的大模…...