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

C++ list类

C++ list类

目录

  • C++ list类
    • 引言
    • 1.list的使用
      • 1.1 list的构造
      • 1.2 list的iterator的使用
      • 1.3 list capacity
      • 1.4 list element acess
      • 1.5 list modifiers
    • 2. list的迭代器失效
    • 3. list的模拟实现
      • 3.1 List.h文件
      • 3.2 List的反向迭代器
    • 4.list与vector的对比

引言

在C++标准库中,list是一个非常重要的容器类,它实现了双向链表的数据结构。本文将详细介绍C++中list的使用方法,包括其构造函数、迭代器、容量操作、元素访问以及修改操作等。此外,我们还将探讨list的迭代器失效问题,并通过模拟实现一个简单的list类来深入理解其底层工作原理。最后,我们将对比listvector的优缺点,帮助读者在实际开发中根据需求选择合适的容器。

list的文档介绍

1.list的使用

1.1 list的构造

constructor构造函数接口说明
list (size_type n, const value_type& val =value_type())构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用**[first, last)**区间中的元素构造list

1.2 list的iterator的使用

可以先将迭代器理解为一个指针,该指针指向list中的某个节点

函数声明接口说明
begin+end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin+rend返回第一个元素的reverse_iterator,即end位置**,**返回最后一个元素下一个位置的reverse_iterator,即begin位置

注意:

  1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
  2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

迭代器的分类

从功能可以分为四种 iterator,reverse_iterator,const_iterator,const_reverse_iterator

从性质上又可以分为三种

性质使用的类可用操作符
单向 (ForwardIterator)forward_list / unordered_map …++
双向 (BidirectionalIterator)list / map / set…++ / –
随机 (RandomAccessIterator)vector / string / deque…++ / – / + / -

由迭代器的底层结构决定可以使用哪些算法


1.3 list capacity

函数声明接口说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

1.4 list element acess

函数声明接口说明
front返回list的第一个节点中值的引用
back返回list的最后一个节点中值的引用

1.5 list modifiers

函数声明接口说明
push front在list首元素前插入值为val的元素
pop front删除list中第一个元素
push back在list尾部插入值为val的元素
pop back删除list中最后一个元素
insert在list position位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个list中的元素
clear清空list中的有效元素

2. list的迭代器失效

迭代器失效即迭代器所指向的节点无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

代码示例

void TestListIterator1()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array+sizeof(array)/sizeof(array[0]));auto it = l.begin();while (it != l.end()){// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值l.erase(it);++it;}
}
// 改正
void TestListIterator()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array+sizeof(array)/sizeof(array[0]));auto it = l.begin();while (it != l.end()){l.erase(it++); // it = l.erase(it);}
}

3. list的模拟实现

3.1 List.h文件

#pragma once
#include<assert.h>namespace jason
{template<class T>struct list_node{T _data;                // 节点存储的数据list_node<T>* _next;    // 指向下一个节点的指针list_node<T>* _prev;    // 指向前一个节点的指针// 构造函数,初始化节点的数据和指针list_node(const T& data = T()):_data(data)        // 初始化数据, _next(nullptr)   // 初始化下一个节点指针为空, _prev(nullptr)    // 初始化前一个节点指针为空{}};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;}// 前置++操作符,迭代器指向下一个节点Self& operator++(){_node = _node->_next;return *this;}// 前置--操作符,迭代器指向前一个节点Self& operator--(){_node = _node->_prev;return *this;}// 后置++操作符,迭代器指向下一个节点,但返回自增前的迭代器Self operator++(int){Self tmp(*this);  // 保存当前迭代器_node = _node->_next;  // 指向下一个节点return tmp;  // 返回自增前的迭代器}// 后置--操作符,迭代器指向前一个节点,但返回自减前的迭代器Self operator--(int){Self tmp(*this);  // 保存当前迭代器_node = _node->_prev;  // 指向前一个节点return tmp;  // 返回自减前的迭代器}// 不等于操作符,判断两个迭代器是否指向不同的节点bool operator!=(const Self& s) const{return _node != s._node;}// 等于操作符,判断两个迭代器是否指向相同的节点bool operator==(const Self& s) const{return _node == s._node;}};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;}// 初始化空链表void empty_init(){_head = new Node;  // 创建哨兵节点_head->_next = _head;  // 哨兵节点的下一个节点指向自己_head->_prev = _head;  // 哨兵节点的前一个节点指向自己_size = 0;  // 初始化链表大小为0}// 默认构造函数,初始化空链表list(){empty_init();}// 使用初始化列表构造链表list(initializer_list<T> il){empty_init();for (auto& e : il){push_back(e);  // 将初始化列表中的元素逐个插入链表}}// 拷贝构造函数list(const list<T>& lt){empty_init();for (auto& e : lt){push_back(e);  // 将另一个链表中的元素逐个插入当前链表}}// 赋值操作符list<T>& operator=(list<T> lt){swap(lt);  // 交换当前链表和传入链表的内容return *this;}// 析构函数,释放链表内存~list(){clear();  // 清空链表delete _head;  // 删除哨兵节点_head = nullptr;}// 清空链表void clear(){auto it = begin();while (it != end()){it = erase(it);  // 逐个删除链表中的节点}}// 交换两个链表的内容void swap(list<T>& lt){std::swap(_head, lt._head);  // 交换哨兵节点std::swap(_size, lt._size);  // 交换链表大小}// 在链表末尾插入元素void push_back(const T& x){insert(end(), x);  // 在链表末尾插入元素}// 在链表头部插入元素void push_front(const T& x){insert(begin(), x);  // 在链表头部插入元素}// 在指定位置插入元素iterator insert(iterator pos, const T& x){Node* cur = pos._node;  // 当前节点Node* prev = cur->_prev;  // 前一个节点Node* newnode = new Node(x);  // 创建新节点// 将新节点插入到前一个节点和当前节点之间newnode->_next = cur;cur->_prev = newnode;newnode->_prev = prev;prev->_next = newnode;++_size;  // 链表大小加1return newnode;  // 返回指向新节点的迭代器}// 删除链表末尾的元素void pop_back(){erase(--end());  // 删除链表末尾的元素}// 删除链表头部的元素void pop_front(){erase(begin());  // 删除链表头部的元素}// 删除指定位置的元素iterator erase(iterator pos){assert(pos != end());  // 确保不删除哨兵节点Node* prev = pos._node->_prev;  // 前一个节点Node* next = pos._node->_next;  // 下一个节点// 将前一个节点和后一个节点连接起来prev->_next = next;next->_prev = prev;delete pos._node;  // 删除当前节点--_size;  // 链表大小减1return next;  // 返回指向下一个节点的迭代器}// 返回链表的大小size_t size() const{return _size;}// 判断链表是否为空bool empty() const{return _size == 0;}private:Node* _head;  // 哨兵节点size_t _size;  // 链表大小};struct AA{int _a1 = 1;int _a2 = 1;};// 按需实例化// T* const ptr1// const T* ptr2template<class Container>void print_container(const Container& con){// const iterator -> 迭代器本身不能修改// const_iterator -> 指向内容不能修改typename Container::const_iterator it = con.begin();//auto it = con.begin();while (it != con.end()){//*it += 10;cout << *it << " ";++it;}cout << endl;for (auto e : con){cout << e << " ";}cout << endl;}}

3.2 List的反向迭代器

由于反向迭代器的++就是正向迭代器的- -,反向迭代器的- -就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可

template<class Iterator>
class ReverseListIterator
{// 注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量// 否则编译器编译时就不知道Ref是Iterator中的类型还是静态成员变量// 因为静态成员变量也是按照 类名::静态成员变量名 的方式访问的
public:typedef typename Iterator::Ref Ref;typedef typename Iterator::Ptr Ptr;typedef ReverseListIterator<Iterator> Self;
public://// 构造ReverseListIterator(Iterator it): _it(it){}//// 具有指针类似行为Ref operator*(){Iterator temp(_it);--temp;return *temp;}Ptr operator->(){ return &(operator*());}//// 迭代器支持移动Self& operator++(){--_it;return *this;}Self operator++(int){Self temp(*this);--_it;return temp;}Self& operator--(){++_it;return *this;}Self operator--(int){Self temp(*this);++_it;return temp;}//// 迭代器支持比较bool operator!=(const Self& l)const{ return _it != l._it;}bool operator==(const Self& l)const{ return _it != l._it;}Iterator _it;
};

4.list与vector的对比

vectorlist
底层结构动态顺序表,一段连续空间带头结点的双向循环链表
随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)
插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)
空间利用率底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低
迭代器原生态指针对原生态指针(节点指针)进行封装
迭代器失效在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值否则会失效插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响
使用场景需要高效存储,支持随机访问,不关心插入删除效率大量插入和删除操作,不关心随机访问

相关文章:

C++ list类

C list类 目录 C list类引言1.list的使用1.1 list的构造1.2 list的iterator的使用1.3 list capacity1.4 list element acess1.5 list modifiers 2. list的迭代器失效3. list的模拟实现3.1 List.h文件3.2 List的反向迭代器 4.list与vector的对比 引言 在C标准库中&#xff0c;l…...

LeetCode 热题 100_跳跃游戏(78_55_中等_C++)(贪心算法)

LeetCode 热题 100_跳跃游戏&#xff08;78_55&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心算法&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;贪心算法&#xff09;&am…...

【Redis】Redis的数据删除(过期)策略,数据淘汰策略。

如果问到&#xff1a;假如Redis的key过期之后&#xff0c;会立即删除吗&#xff1f; 其实就是想问数据删除(过期)策略。 如果面试官问到&#xff1a;如果缓存过多&#xff0c;内存是有限的&#xff0c;内存被占满了怎么办&#xff1f; 其实就是问&#xff1a;数据的淘汰策略。…...

C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval

目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...

深入解析 Spring Boot 中的 FailureAnalyzer

深入解析 Spring Boot 中的 FailureAnalyzer 在 Spring Boot 应用中&#xff0c;我们难免会遇到启动失败的情况&#xff0c;而默认的异常信息往往过于复杂&#xff0c;导致排查问题变得困难。Spring Boot 提供了一套强大的 FailureAnalyzer 机制&#xff0c;能够捕获常见的异常…...

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…...

【Matlab GUI】封装matlab GUI为exe文件

注&#xff1a;封装后的exe还是需要有matlab环境才能运行 &#xff08;1&#xff09;安装MCRinstaller.exe文件&#xff0c;在matlab安装目录下的toolbox/compiler/deploy/win64文件夹里 &#xff08;2&#xff09;安装完MCRinstaller.exe&#xff0c;字命令窗口输入&#x…...

ModBus TCP/RTU互转(主)(从)|| Modbus主动轮询下发的工业应用 || 基于智能网关的串口服务器进行Modbus数据收发的工业应用

目录 前言 一、ModBus TCP/RTU互转&#xff08;从&#xff09;及应用|| 1.1 举栗子 二、ModBus TCP/RTU互转&#xff08;主&#xff09; 2.1 举栗子 三、ModBus 主动轮询 3.1 Modbus主动轮询原理 3.2 Modbus格式上传与下发 3.2.1.设置Modbus主动轮询指令 3.2.2 设…...

Linux top 命令详解:从入门到高级用法

Linux top 命令详解&#xff1a;从入门到高级用法 在 Linux 系统中&#xff0c;top 是一个强大的实时监控工具&#xff0c;用于查看系统资源使用情况和进程状态。它可以帮助你快速了解 CPU、内存、负载等信息&#xff0c;是系统管理员和开发者的日常利器。本文将从基本用法开始…...

【网络协议】基于UDP的可靠协议:KCP

TCP是为流量设计的&#xff08;每秒内可以传输多少KB的数据&#xff09;&#xff0c;讲究的是充分利用带宽。而 KCP是为流速设计的&#xff08;单个数据包从一端发送到一端需要多少时间&#xff09;&#xff0c;以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信…...

【Docker入门】构建推送第一个Docker映像

【Docker入门】构建推送第一个Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是轻量级的可执行独立包&#xff0c;包含代码、运行时、库、环境变量以及配置文件&#xff0c;它对于运行软件至关重要。注册表可在团队间分享映像。…...

Python----计算机视觉处理(Opencv:图像颜色替换)

一、开运算 开运算就是对图像先进行腐蚀操作&#xff0c; 然后进行膨胀操作。开运算可以去除二值化图中的小的噪点&#xff0c;并分离相连的物体。 其主要目的就是消除那些小白点 在开运算组件中&#xff0c;有一个叫做kernel的参数&#xff0c;指的是核的大小&#xff0c;通常…...

搭建自己的OCR服务

网上看到相关文章&#xff0c;这里整理记录一下&#xff0c;仅供学习。 搭建自己的OCR服务&#xff0c;第一步&#xff1a;选择合适的开源OCR项目 - PandaCode辉 - 博客园 一、OCR是什么&#xff1f; 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09…...

vue:组件的使用

Vue&#xff1a;组件的使用 1、什么是组件 1.1、传统方式开发的应用 一个网页通常包括三部分&#xff1a;结构&#xff08;HTML&#xff09;、样式&#xff08;CSS&#xff09;、交互&#xff08;JavaScript&#xff09;。在传统开发模式下&#xff0c;随着项目规模的增大&a…...

leetcode日记(105)买卖股票的最佳时机Ⅱ

原本以为是一个很难想的动态规划&#xff0c;没想到是最简单的贪心…… 如果实在想不出就画个折线图&#xff0c;只买上涨的就行了&#xff0c;所有上涨的段都取到。 真的没想到会这么简单…… class Solution { public:int maxProfit(vector<int>& prices) {int …...

7种数据结构

7种数据结构 顺序表sqlite.hseqlite.c 单链表linklist.clinklist.h 双链表doulinklist.cdoulinklist.h 链式栈linkstack.clinkstack.h 队列SeqQueue.cSeqQueue.h 树tree.c 哈希表hash.c 顺序表 sqlite.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef struct person…...

论文阅读:Deep Hybrid Camera Deblurring for Smartphone Cameras

今天介绍一篇 ACM SIGGRAPH 2024 的文章&#xff0c;关于手机影像中的去模糊的文章。 Deep Hybrid Camera Deblurring for Smartphone Cameras Abstract 手机摄像头尽管取得了显著的进步&#xff0c;但由于传感器和镜头较为紧凑&#xff0c;在低光环境下的成像仍存在困难&am…...

Redis 三主三从集群部署的完整方案

一、架构设计原理‌ 分布式数据分片 哈希槽机制‌&#xff1a;Redis Cluster 将数据划分为 16384 个槽位&#xff0c;每个主节点负责部分槽位&#xff08;如主节点1管理槽0-5460&#xff0c;主节点2管理5461-10922等&#xff09;。 自动负载均衡‌&#xff1a;数据按哈希值分配…...

C++项目:高并发内存池_上

目录 1. 项目介绍 2. 内存池概念 2.1 池化技术 2.2 内存池和内存碎片 2.3 细看malloc 3. 定长内存池的实现 ObjectPool.hpp 4. 高并发内存池框架 5. thread cache测试 5.1 thread cache框架 5.2 ConcurrentAlloc.hpp 6. central cache测试 6.1 central cache框架 …...

『Plotly实战指南』--折线图绘制基础篇

在数据分析的世界中&#xff0c;折线图是一种不可或缺的可视化工具。 它能够清晰地展示数据随时间或其他变量的变化趋势&#xff0c;帮助我们快速发现数据中的模式、趋势和异常。 无论是金融市场分析、气象数据监测&#xff0c;还是业务增长趋势预测&#xff0c;折线图都能以直…...

【css酷炫效果】纯CSS实现波浪形分割线

【css酷炫效果】纯CSS实现波浪形分割线 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492023 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…...

【资料分享】全志科技T113-i全国产(1.2GHz双核A7 RISC-V)工业核心板规格书

核心板简介 创龙科技SOM-TLT113 是一款基于全志科技T113-i 双核ARM Cortex-A7 玄铁C906 RISC-V HiFi4 DSP 异构多核处理器设计的全国产工业核心板&#xff0c;ARM Cortex-A7 处理单元主频高达1.2GHz。核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&…...

Coco AI 智能检索 Hugo Blog 集成指南

在此前的文章中&#xff0c;我们介绍了如何使用 Coco Server 连接 Notion&#xff0c;实现智能内容检索。本次&#xff0c;我们将进一步探索如何在 Coco Server 最新版本 中集成 Hugo Site&#xff0c;以便对 Hugo 站点 进行高效检索。 Coco Server 部署方式 要在本地或服务器…...

【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…...

jmeter将返回的数据写入csv文件

举例说明&#xff0c;我需要接口返回体中的exampleid与todoid的数据信息&#xff08;使用边界提取器先将其提取&#xff09;&#xff0c;并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…...

AI如何在财务工作中提升效率的一些看法

文章目录 1. 自动化重复性任务2. 财务预测与分析3. 欺诈检测与风险管理4. 智能报表与决策支持5. 税务管理优化6. 提升团队协作与客户体验未来的趋势与挑战结论 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其正全方位地革新各行各业的运作模式&#xff0…...

OpenCV入门指南:从安装到基本操作

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它包含了数百种计算机视觉算法&#xff0c;广泛应用于图像处理、视频分析、物体检测、人脸识别等领域。本文将带你从安装OpenCV开始&#xff0c;逐步了解其基…...

简单以太网配置

display arp //查看路由器mac地址 交换机配置命令&#xff1a; system-view // 从用户视图进入系统视图 dis mac-address //查看mac地址表 路由器配置命令: system-view // 从用户视图进入系统视图 int GigabitEthernet 0/0/0 //进入G口 0/0/0 进入之后配置网关: ip addre…...

蓝桥杯嵌入式组第十四届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.4.1 频率变化处理1.3.4.1 占空比计算 1.3.5 ADC模块 2.源码2.1cubemx配置3.第十四届题目 前言&#xff1a;STM32G431RBT6实现嵌入…...

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…...

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…...

在Vue3中使用Echarts的示例

1.常用-引用ts文件方式 1.1 导出ts文件-一个简单的柱状图 export const baseBarChart (xdata: string[], data: number[][], legendData: string[]) > {if (data.length 0) {return noData;}// 定义颜色数组const color [#00CCCC,#FF9900,#1677DC,#FF6666,#B366FF,#666…...

TCP协议的多线程应用、多线程下的网络编程

DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式&#xff0c;一个服务端对应一个客户端&#xff0c;实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类&#xff0c;多线程接收socket对象 public class ServerSocketNable implements Run…...

每日学习Java之一万个为什么(待补充)

Git分支操作 git branch 分支名 git branch -v git checkout -b 分支名 git checkout 分支名 git merge 分支名 git branch -d | -D 分支名Git冲突 git同名文件合并的最基本单位是行。同名文件同一行不同就会发生冲突。 解决办法&#xff1a;及时沟通&#xff0c;手动更改&…...

设计C语言的单片机接口

一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式&#xff0c;输入为1&#xff0c;输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法&#xff1a; void pin_output(s…...

博客迁移----宝塔面板一键迁移遇到问题

前景 阿里云轻量级服务器到期了&#xff0c;又免费领了个ESC&#xff0c; 安转了宝塔面板。现在需要迁移数据&#xff0c;使用宝塔面板一键迁移功能&#xff0c;完成了数据的迁移&#xff0c;改了域名的解析&#xff0c;现在进入博客是显示502 bad grateway 宝塔搬家参考链接…...

抽象工厂模式 (Abstract Factory Pattern)

抽象工厂模式 (Abstract Factory Pattern) 是一种创建型设计模式&#xff0c;它提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 一、基础 1. 意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 2. …...

LeetCode 第14~16题

目录 LeetCode 第14题&#xff1a;最长公共前缀 LeetCode 第15题&#xff1a;三数之和 LeetCode 第16题&#xff1a;最接近的三数之和 LeetCode 第14题&#xff1a;最长公共前缀 题目描述 编写一个函数来查找字符数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回字符…...

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件&#xff0c;就有了版本控制器&#xff1b; 所谓的版本控制器&#xff0c;就是能够了解到一个文件的历史记录&#xff08;修改记录&#xff09;&#xff1b;简单来说就是记录每一次的改动和版本迭代的一个管理系统&#xff0c;同…...

再学:abi编码 地址类型与底层调用

目录 1.内置全局变量及函数 2.abi 3.地址类型 4.transfer 1.内置全局变量及函数 2.abi data就是abi编码 abi描述&#xff1a;以json格式表明有什么方法 3.地址类型 4.transfer x.transfer:合约转给x call 和 delegatecall 是 Solidity 中用于底层合约调用的函数&#xff0…...

Redis的消息队列是怎么实现的

Redis 本身并不是一个专门的消息队列系统,但它的 List、Pub/Sub 和 Stream 数据结构可以用来实现消息队列的功能。以下是 Redis 实现消息队列的几种常见方式: 1. 基于 List 实现消息队列 Redis 的 List 是一个双向链表,支持在头部和尾部进行高效的插入和删除操作,非常适合…...

图论入门【数据结构基础】:什么是树?如何表示树?

图论是计算机科学和数学中的一个重要分支&#xff0c;研究图的结构及其性质。之前我们介绍了图的基本概念和表示&#xff1a;图论入门【数据结构基础】&#xff1a;什么是图&#xff1f;如何表示图&#xff1f;&#xff0c;本文将介绍树的基本概念、性质及其在计算机科学中的应…...

微信小程序订阅消息发送消息,点击消息进入小程序页面

1、在小程序官网订阅消息选用或创建消息模板获取模板ID可多个 如图&#xff1a; 2、微信小程序前端页面发送请求订阅权限 请求模板id的权限可以是一个可以是多个&#xff0c;用户同意订阅&#xff0c;获取code传递给后端——后端拿到code生成唯一的openid用于发送订阅消息 注…...

基于小参数量大语言模型(Small Language Models) ---- 在制造业落地降本增效应用:可行性研究初探

文章大纲 一、引言二、小参数量模型概述基本技术要求小参数量大语言模型在制造业场景中的适用性分析(一)排产优化(二)错误根因分析三、制造业小参数量大语言模型开源解决方案简介Bert 系列 模型Google微软MetaMistral AI国产解决方案四、技术实现方案进行逻辑(一)模型选择…...

pandas中excel自定义单元格颜色

writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比&#xff1a; ws.cell(1,2).value固定学生占比…...

MySQL事务:确保数据一致性的关键机制

目录 1. 为什么需要事务&#xff1f; 2. 什么是事务&#xff1f; 3. 事务的四大特性 3.1 原子性&#xff08;Atomicity&#xff09; 3.2 一致性&#xff08;Consistency&#xff09; 3.3 隔离性&#xff08;Isolation&#xff09; 3.4 持久性&#xff08;Durability&…...

图论入门【数据结构基础】:什么是图?如何表示图?

图&#xff08;Graph&#xff09; 是一种非线性数据结构&#xff0c;用于表示对象之间的关系。图由 顶点&#xff08;Vertex&#xff09; 和 边&#xff08;Edge&#xff09; 组成&#xff0c;其中顶点表示对象&#xff0c;边表示对象之间的关系。图广泛应用于计算机科学、数学…...

SpringBoot中使用AJ-Captcha实现行为验证码(滑动拼图、点选文字)

简介 AJ-Captcha行为验证码&#xff0c;包含滑动拼图、文字点选两种方式&#xff0c;UI支持弹出和嵌入两种方式。后端提供Java、Golang实现&#xff0c;前端提供了php、angular、html、vue、uni-app、flutter、android、ios等代码示例。点击前往AJ-Captcha代码仓库 引入Maven…...

【国际研讨会】2025年3-5月通信、算法、电气工程、自动化等领域国际学术会议征稿开启!大型学术盛宴!

【国际研讨会】2025年3-5月通信、算法、电气工程、自动化等领域国际学术会议征稿开启&#xff01;大型学术盛宴&#xff01; 【国际研讨会】2025年3-5月通信、算法、电气工程、自动化等领域国际学术会议征稿开启&#xff01;大型学术盛宴&#xff01; 文章目录 【国际研讨会】…...

AI战略家:X厂三年复盘大纲——业务与组织双视角深度拆解

一、业务负责人视角&#xff1a;从0到1与从1到100的核心能力模型 &#xff08;一&#xff09;阶段能力要求与问题预判 1. 从0到1&#xff1a;破局能力 核心能力升级框架&#xff1a; 需求洞察三阶漏斗&#xff1a; 行业需求池&#xff1a;广泛收集行业内的各种需求&#xff…...