初阶数据结构(3)顺序表
Hello~,欢迎大家来到我的博客进行学习!
目录
- 1.线性表
- 2.顺序表
- 2.1 概念与结构
- 2.2 分类
- 2.2.1 静态顺序表
- 2.2.2 动态顺序表
- 2.3 动态顺序表的实现
- 初始化
- 尾插
- 头插
- 尾删
- 头删
- 查找
- 指定位置之前插入数据
- 删除指定位置的数据
- 销毁
1.线性表
首先我们需要知道的是,顺序表和链表都属于线性表。线性表是具有相同特性的一类数据结构的集合。
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。
这里的相同特性我从逻辑结构和物理结构两个方面进行分析。
- 逻辑结构(一定是线性的):人为想象出来的。
- 物理结构(不一定是线性的):比如数组在存储空间是连续的,和物理结构上的线性是一样的。
2.顺序表
2.1 概念与结构
概念:顺序表是用⼀段物理地址连续的存储单元(物理结构是线性的)依次存储数据元素的线性结构,⼀般情况下采用数组存储。顺序表的底层结构是数组。
顺序表和数组的区别?
顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。
2.2 分类
2.2.1 静态顺序表
如果顺序表底层是固定的空间大小,我们把它叫做静态顺序表。
实现静态顺序表,需要三个文件:头文件(.h)、源文件(.c)、测试文件(test.c)。
- 头文件(.h):用来声明一些结构和我们的方法
- 源文件(.c):方法的具体实现
- 测试文件(test.c):用于测试
取名为SeqList(Sequence List),意为连续的。
我们可以定义一下静态顺序表的大小N,还需要一个size来定义一下有效数据的个数。同时这里的数据类型可能是各种各样的,使用typedef来解决。当要使用这个结构体的时候,我每次都要加上关键词,感觉麻烦,使用typedef来解决。
SeqList.h
#define N 1000
typedef char SLDataType;
//静态顺序表
typedef struct SeqList {SLDataType arr[N];int size;//有效数据的个数
}SL;
2.2.2 动态顺序表
如果空间是不固定的,我想要多少,可以去增加,就是动态顺序表。
#define N 1000
typedef char SLDataType;
//动态顺序表
typedef struct SeqList {SLDataType* arr;int size;//有效数据的个数int capacity;//容量大小
}SL;
2.3 动态顺序表的实现
初始化
现在我先进行初始化,参数传一个s,初始化的具体方法在SeqList.c文件中实现。
SeqList.c
#include"SeqList.h"
//初始化
void SLInit(SL s)
{s.arr = NULL;s.size = s.capacity = 0;
}
在test.c中进行检验。
#include"SeqList.h"
void SLTest()
{SL sl;SLInit(sl);
}int main()
{SLTest();return 0;
}
此时会报错:
在test.c的sl是实参,在SeqList里面的s为形参。
我们需要将sl的地址传过去,而不是传值。传值时,改变形参并不能改变实参。在SeqList.c这里我就应该用指针来接收。
改完以后:
SeqList.c
#include"SeqList.h"
//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
test.c
#include"SeqList.h"
void SLTest()
{SL sl;SLInit(&sl);
}int main()
{SLTest();return 0;
}
SeqList.h
#include<stdio.h>
#include<stdlib.h>
#define N 1000
typedef int SLDataType;
静态顺序表
//typedef struct SeqList {
// SLDataType arr[N];
// int size;//有效数据的个数
//}SL;//动态顺序表
typedef struct SeqList {SLDataType* arr;int size;//有效数据的个数int capacity;//容量大小
}SL;//初始化
void SLInit(SL* ps);
调试看看:
跳出以后,sl里面的部分也初始化了:
尾插
现在来添加插入数据的功能,顺序表的底层是数组,我可能需要需要在原来数据的末尾、中间、开头插入数据。
首先实现尾插(在顺序表最后一个可插的位置,插入数据)的功能。
如上图,我有5块空间,里面有3个有效数据。尾插就是在3的后面插入数据。
用SLPushBack这个函数来实现,里面的参数为ps和我们要插入的数据。现在我们需要在顺序表里插入数据,这里有三个成员:arr、size、capacity。size指向的位置刚好就是最后一个有效数据的下一个位置。
假设空间足够,现在往里面插入一个数据X = 99,直接往3后面放,这里并不需要遍历数据组,往size这个位置放就行,插入完成之后,size++。
//尾插
void SLPushBack(SL* ps, SLDataType x)
{ps->arr[ps->size] = x;++ps->size;
}
假设空间不够(此时size和capacity在一个位置),按以上方式插入数据,会越界。就需要对原数组申请空间,,然后再在size位置插入数据,插入后size++。
因而我们需要分情况来写。
在增容时,我们使用realloc(可以在原数组的基础上进行增加容量)来进行这一操作。如果插一个数据,增加一个容量,没有空间的浪费,但是增容频繁,程序效率低下。如果一次多申请一些,可能会造成空间的浪费。通常,增容是按倍数增加,如2倍、3倍…这里我选择两倍。
按照以上思路,其实是有漏洞的。
//尾插
void SLPushBack(SL* ps, SLDataType x)
{//空间不够,申请空间if (ps->size == ps->capacity){//空间不够,2倍增容SLDataType* tmp = (SLDataType*)realloc(ps->arr, ps->capacity * 2);}ps->arr[ps->size++] = x;
}
在realloc这里,第二个参数是size_t size单位是字节,ps->capacity * 2 这里改为 ps->capacity * 2 *sizeof(SLDataType)。并看看增容成功没有。但是之前我们初始化那里把capacity初始化为0,现在需要扩容的话,需要先给一个初始值。我这里先给一个SLDestroy函数,在程序结束时释放动态分配的内存,不然程序结束时会出现内存泄漏。
SeqList.c
#include"SeqList.h"
//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}//尾插
void SLPushBack(SL* ps, SLDataType x)
{if (ps == NULL){return;}//空间不够,申请空间if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//空间不够,2倍增容SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}ps->arr[ps->size++] = x;
}// 释放顺序表
void SLDestroy(SL* ps)
{if (ps->arr != NULL) {free(ps->arr); // Free the allocated memoryps->arr = NULL;}
}
头插
现在来实现头插。这里也要看空间大小够不够,则可以分装一个方法来判断空间大小够不够。前面的步骤和尾插差不多,只是实现头插时有部分区别。需要把数据整体往后移动,然后再进行插入。在移动的时候,先把后面的数据往后移动,最后把插入的数据放在下标为0的位置。同样在增加完数据之后,size++。
SeqList.c
#include"SeqList.h"
//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLcheckCapacity(SL* ps)
{//空间不够,申请空间if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//空间不够,2倍增容SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}
}//尾插
void SLPushBack(SL* ps, SLDataType x)
{if (ps == NULL){return;}SLcheckCapacity(ps);ps->arr[ps->size++] = x;
}//头插
void SLPushFront(SL* ps, SLDataType x)
{if (ps == NULL){return;}SLcheckCapacity(ps);//直接头插//数据整体向后移动一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}
尾删
ps不能传空,删除数据之后,size要 - -。顺序表为空,也不行。这里把最后一个数据弄掉,不是把最后一个数据弄为0,而是可以修改。
//尾删
void SLPopBack(SL* ps)
{assert(ps&&ps->size>0);--ps->size;}
头删
这里的前提和尾删一样。ps不能传空,删除数据之后,size要 - -。顺序表为空,也不行。我们需要移动数据,下标为零以后的数据,整体向前移动一位。
//头删
void SLPopFront(SL* ps)
{assert(ps && ps->size > 0);--ps->size;for (int i = 0; i<ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}
}
查找
这里比较简单,遍历顺序表,如果查找到返回下标;如果找不到返回无效下标。
//查找
int SLFind(SL* ps, SLDataType x)
{for(int i = 0; i < ps->size; i++){if (x == ps->arr[i]){//找到了,返回下标return i;}}//找不到return -1;
}
指定位置之前插入数据
这里新增一个参数pos(指定位置)。pos需要有效,pos >= 0 && pos <= ps->size。与之前一样需要判断空间是否足够,插入好之后size++。
假设需要将99这个数据插入3这个位置之前,需要将pos以及之后的数据向后移动一位。
//指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);//前=:头插//后=:尾插assert(pos >= 0 && pos <= ps->size);SLcheckCapacity(ps);for (int i = ps->size - 1; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}
删除指定位置的数据
同样的size需要减减,指定位置pos必须pos >= 0 && pos <= ps->size。要删除pos位置的数据就需要把pos之后的数据整体向前移。
//删除指定位置的数据
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos;i<ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}
销毁
动态申请的空间在不用的时候需要销毁。
//销毁
void SLDestroy(SL* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}
此时,我们对顺序表已经比较理解了。
好了,我们的顺序表的知识就讲到这里。如果文章内容有误,请大佬在评论区斧正!谢谢大家!
相关文章:
初阶数据结构(3)顺序表
Hello~,欢迎大家来到我的博客进行学习! 目录 1.线性表2.顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现初始化尾插头插尾删头删查找指定位置之前插入数据删除指定位置的数据销毁 1.线性表 首先我们需要知道的是,…...
智能DNS解析:解决高防IP地区访问异常的实战指南
摘要:针对高防IP在部分地区无法访问的问题,本文设计基于智能DNS的流量调度方案,提供GeoDNS配置与故障切换代码示例。 一、问题背景 运营商误拦截或线路波动可能导致高防IP在福建、江苏等地访问异常。传统切换方案成本高,智能DNS可…...
瑞芯微RK3568嵌入式AI项目实战:项目方向(三)
基于RK3568的成熟开源项目和实战资源丰富,以下是针对小白的精选推荐及学习路径规划,结合多个开源项目和详细教程,帮助快速入门嵌入式开发: 一、OpenHarmony智能设备开发 1. 凌蒙派-RK3568开发板项目 项目特点:支持Op…...
go游戏后端开发26:红中麻将发牌逻辑
首先,麻将游戏创建房间的逻辑与之前我们做过的“赢三张”创建房间的逻辑是一致的,整体上没有问题。不同之处在于,我们在创建房间时会根据游戏类型来创建对应的“game”,即创建的是麻将的“game”。大家之前写过相关代码࿰…...
DataFrame的遍历、排序、去重与分组
一.遍历 1.1 series遍历 import pandas as pds pd.Series([a,b,c,d,e,f],index[1,2,3,4,5,6])for i in s:print(i) a b c d e f 可见,遍历series会直接拿到其中的值 1.2 DataFrame遍历 1.2.1 直接遍历 import pandas as pd data {name: [Alice, Bob, Charlie]…...
QEMU源码全解析 —— 块设备虚拟化(17)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社...
Java 中使用 File 类创建文件
文章目录 Java 中的 File 类一、文件(File)定义 二、File 类的介绍1 创建文件对象的相关构造器2 createNewFile() 的作用3 获取文件相关信息的常用方法4 目录的操作和文件的删除 Java 中的 File 类 在 Java 中,文件和文件流是处理数据输入/输…...
PowerBI-按钮过滤筛选-宜宾五粮液股份有限公司财务分析
下面为Powerbi制作的财务主题数据分析模版,以可视化的效果展示了某股份有限公司的财务关键指标数据,如营业收入、净利润、毛利率和净利率等。以瀑布图的方式展示了利润表项目金额情况,以树图方式展示了企业资产负债数据。另外图表可以进行筛选…...
【PyQt5】QSS样式表如何使用
在 PyQt5 中,使用 QSS(Qt Style Sheets)来为窗口中的各个控件添加样式是非常方便的,类似于 HTML 中的 CSS。你可以通过 QWidget.setStyleSheet() 方法应用 QSS 样式,或者通过 .qss 文件来设置样式。 基本步骤…...
数据结构:用生活中的例子解释 AOE 网中活动的最早和最迟开始时间的含义和计算方法
生活实例:装修房子中的活动安排 假设你要装修一套房子,主要流程如下: 拆旧(活动 A,3 天) → 拆旧完成(事件 X)水电改造(活动 B,4 天) → 水电完…...
第二篇:系统分析师——7-11章
目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌…...
二十七- Scala
抽象属性和方法 1. 基本语法: 定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类 定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性 定义抽象方法:def hello():String //…...
轨检探伤专用一体机平板电脑:为铁路安全保驾护航
在铁路轨道检测领域,高效、精准的探伤设备是保障列车安全运行的核心工具。鲁成伟业针对轨检探伤小车的严苛需求,推出了多款高性能专用一体机平板电脑,以创新的技术设计和卓越的适应性,成为行业标杆解决方案。以下从产品性能、技术…...
2018年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2018年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
Python数据爬取
一.example1包下的 注意:需要在终端安装pip3 install -i https://requests.readthedocs.io/en/latest/ requests 1.Python网络爬虫初探-get请求 import requests rrequests.get(https://www.baidu.com) print(r.text) r1requests.get(https://www.jd.com) print…...
【详细解析:如何在小程序中实现动态二维码和预约信息展示】
背景介绍 随着小程序的快速发展,二维码已成为很多线上线下场景中必不可少的工具。在这篇文章中,我将分享如何在小程序中实现一个动态生成二维码并展示预约信息的功能。我们会使用 Vue 和 uni-app 框架,结合自定义的 API,来获取预…...
信息学奥赛一本通 1929:【04NOIP普及组】火星人 | 洛谷 P1088 [NOIP 2004 普及组] 火星人
【题目链接】 ybt 1929:【04NOIP普及组】火星人 洛谷 P1088 [NOIP 2004 普及组] 火星人 【题目考点】 1. 深搜回溯 2. STL next_permutation函数 头文件<algorithm> 函数定义:next_permutation(lb, ub, cmp) lb:区间下界ÿ…...
mysql8.0.29 win64下载
mysql win64安装包 mysql win64安装包下载 mysql win64安装包下载 通过网盘分享的文件:mysql 链接: https://pan.baidu.com/s/1sEOl-wSVtOG5gfIRdt5MXw?pwdgi7i 提取码: gi7i...
C++笔记-string(下)
这篇我们自己来简单实现一下string类中的各个接口,来帮助我们更好地理解string类接口的底层原理。 1.构造函数和析构函数 对于构造函数我们要写两种情况:空字符串和非空字符串 因为我们要自己实现string类,所以就不能用std命名空间…...
Android studio学习之路(六)--真机的调试以及多媒体照相的使用
多媒体应用(语言识别,照相,拍视频)在生活的各个方面都具有非常大的作用,所以接下来将会逐步介绍多媒体的使用,但是在使用多媒体之前,使用模拟器肯定是不行的,所以我们必须要使用真机…...
Airflow集成Lark机器人
🥭1. 实现目标 🕐 通过自定义函数,实现Lark机器人告警功能 🕐 通过Lark机器人代替邮件数据的发送功能 🥭2.自定义函数实现 from airflow import DAG from airflow.operators.python_operator import PythonOperator from airflow.models import Variable import requ…...
【电视软件】小飞电视v2.7.0 TV版-清爽无广告秒换台【永久更新】
软件介绍 小飞电视是一款电视端的直播软件,无需二次付费和登录,资源丰富,高清流畅。具备开机自启、推送功能、自定义直播源、个性化设置及节目预告等实用功能,为用户带来良好的观看体验。基于mytv开源项目二改,涵盖央…...
2025年- H1-Lc109-160. 相交列表--java版
1.题目描述 2.思路 “双指针切换链表头” 思路一:双指针路径对齐 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 让两个指针走相同的总路径长度! 设: 链表 A 独有部分长度是 lenA 链表 B …...
《大模型MCP服务协议与多智能体开发实战10讲》课程大纲
以下是针对大模型MCP(Model Context Protocol)服务协议的多智能体开发系列专栏的10节课课程设计,结合MCP协议特性与多智能体系统的前沿实践,课程结构从协议原理到工程落地,涵盖核心技术、实战案例与前沿趋势࿱…...
C++20 范围库:开启现代 C++ 编程的新篇章
文章目录 一、范围库的核心概念(一)范围(Range)(二)视图(View) 二、范围库的主要特性(一)范围工厂(二)范围适配器(三&…...
基于 Spring Boot 瑞吉外卖系统开发(二)
基于 Spring Boot 瑞吉外卖系统开发(二) 员工登录功能实现 员工登录页面login.html存放在/resources/backend/page/login目录下。 启动项目,在浏览器中通过地址“http://localhost:8080/backend/page/login/login.html”访问员工登录页面。…...
Matlab实现鼠群优化算法优化随机森林算法模型 (ROS-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法(Rat Swarm Optimizer, ROS)是一种基于老鼠觅食行为的新型元启发式优化算法。ROS通过模拟老鼠在寻找食物时的社会互动和群体智能来探索解空间,旨在高效地找到全局最…...
软件工程第四章习题
一、选择题 1.选择题 (1)在需求分析之前有必要进行( )工作。 A.程序设计 B.可行性研究 C. E-R 分析 D.行为建模 (2)需求分析是一个( ),它应该贯穿于系统的整个生命周期,而不是仅仅属于软件生 命周期早期的一…...
第十九:b+树和b-树
优点一: B树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。 优点二: B树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,这样…...
SQL Server查询性能下降:执行计划不稳定与索引优化
问题现象: SQL Server 2022 中某些关键查询性能突然下降,执行时间从毫秒级增至数秒,日志中未报错,但查询计划显示低效的索引扫描或键查找。 快速诊断 捕获实际执行计划: -- 启用实际执行计划 SET STATISTICS XML, TIME…...
python mcp server最佳实践
文章目录 1、使用fastmcp包还是mcp包?要不要使用uv创建虚拟环境?编写mcp server代码测试cline配置小Tip2、使用stdio还是sse?其实能做的选择不多: 1、使用fastmcp包还是mcp包? 2、使用stdio还是sse? 1、使用fastmcp包还是mcp包? 个人建议选择后者,因为大模型说,后者…...
STM32看门狗应用实战:独立看门狗与窗口看门狗深度解析(下) | 零基础入门STM32第九十五步
主题内容教学目的/扩展视频看门狗什么是看门狗,原理分析,启动喂狗方法,读标志位。熟悉在程序里用看门狗。 师从洋桃电子,杜洋老师 📑文章目录 一、看门狗应用架构分析1.1 系统监控流程图1.2 双看门狗应用场景对比 二、…...
操作符详解
1.操作符的分类 算数操作符: 、- 、 * 、 / 、 %移位操作符:>>、 <<位操作符:& 、| 、^ 赋值操作符:、、-、/、%、<<、>>、&、|、^单目操作符:!、、- -、&、*、、…...
LeetCode 第41~43题
目录 LeetCode 第41题:缺失的第一个正数 LeetCode 第42题:接雨水 LeetCode 第43题:字符串相乘 LeetCode 第41题:缺失的第一个正数 题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的…...
蓝桥杯web工作协调
在 JavaScript 里,Set 是一种内置对象,可存储任何类型的唯一值,无论是原始值还是对象引用。下面是 Set 集合常用方法的介绍: 1. 创建 Set 可以使用 new Set() 来创建一个空的 Set,或者传入一个可迭代对象来初始化 Se…...
夜神模拟器无法下载fiddler证书
提示信息: No root certificate was found. Have you enabled HTTPS traffic decryption in Fiddler yet? 在fiddler安装目录运行以下命令: makecert.exe -r -ss my -n "CNDO_NOT_TRUST_FiddlerRoot, ODO_NOT_TRUST, OUCreated by http://www.fidd…...
OpenCV阈值处理详解
文章目录 一、引言二、阈值处理的基本概念2.1 什么是阈值处理?2.2 为什么需要阈值处理? 三、OpenCV中的阈值处理方法3.1 基本阈值处理3.2 阈值类型详解1. 二进制阈值化 (cv2.THRESH_BINARY)2. 反二进制阈值化 (cv2.THRESH_BINARY_INV)3. 截断阈值化 (cv2…...
开源模型应用落地-Qwen2.5-Omni-7B模型-Gradio-部署 “光速” 指南(二)
一、前言 2025年3月,阿里巴巴通义千问团队开源的全模态大模型Qwen2.5-Omni-7B,犹如一记惊雷划破AI领域的长空。这个仅70亿参数的"小巧巨人",以端到端的架构实现了对文本、图像、音频、视频的全模态感知,更通过创新的Thinker-Talker双核架构,将人类"接收-思…...
【仪器仪表专题】案例:信号高电平到底是看顶端值还是最大值?
案例背景 本案例在于审查其他部门信号完整性测试报告中发现的一处有关RS232输入信号质量波形测试问题点。 首先发现测试报告中的RS232时序和信号质量测试中有一个NG项目,如下所示,可以看到T2IN的高电平要求是2.0V~3.6V之间,但是实测是3.8V,超过极限值,所以判定为NG。 …...
Git版本管理系列:(一)使用Git管理单分支
目录 基础概念介绍仓库的创建创建隐藏目录添加代码到暂存区提交代码到仓库提交记录查询比较差异标签文件删除版本回退总结 Git 是一个分布式版本控制系统(DVCS),用于跟踪文件的变更并协调多人协作开发,由 Linus Torvalds 于 2…...
Vue框架的响应式系统
以下是关于 响应式系统 的系统梳理: 一、响应式系统的核心目标 数据驱动视图:自动追踪数据变化并触发视图更新高效依赖追踪:精确识别数据与视图的依赖关系批量异步更新:优化多次数据变更的更新性能组件级更新:最小化DOM操作范围二、核心架构演进 版本核心技术优势局限性Vu…...
【Shell】模拟爬虫下载天龙八部小说
Shell脚本: #curl https://tianlong.5000yan.com/ -o tianlong.html grep "href" tianlong.html | grep html | awk -F"\"" { print $6 } >> urls.txt grep "href" tianlong.html | grep html | awk -F">"…...
WHAT - JavaScript 中 Object.defineProperty() 和 Proxy 对比
目录 一、Object.defineProperty()作用基本语法示例:定义一个只读属性示例:定义 getter/setter 二、Proxy作用基本语法示例:拦截属性访问 对比:defineProperty vs Proxy场景选择建议 在 JavaScript 中,Object.definePr…...
Qt进阶开发:模型/视图原理详解
文章目录 一、模型/视图架构概述二、模型/视图架构的组成部分2.1 模型2.2 视图2.3 委托三、模型类的介绍3.1 模型索引3.2 行和列3.3 父项4.项角色四、视图类的介绍4.1 基本概念4.2 处理项目选择五、委托类的介绍5.1 基本概念5.2 自定义委托六、数据-窗口映射器一、模型/视图架构…...
d202547
目录 一、sql-每月交易 I 二、 sql-按日期分组销售产品 三、sql-列出指定时间段内所有的下单产品 四、 第k个大的数 一、sql-每月交易 I 题目意思就是把国家名称,和年月一样的分为一组,在这组数据中进行计数 题目给的日期格式是yyyy-mm-ss,可以使用l…...
pulsar使用指南
Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞…...
底盘---麦克纳姆轮(Mecanum Wheel)
一、基本定义与起源 定义:麦克纳姆轮是一种实现全向移动的特殊轮式结构,通过在主轮周边安装多个倾斜的辊子(小轮),使设备能够在平面上向任意方向移动(包括横向、斜向、旋转等),无需…...
内网文件传输新体验,聊天、传输、自定义,一应俱全
Flix 是一款高效、便捷的跨平台局域网文件传输工具,支持 Windows、macOS、Android、iOS 和 Linux 等多种操作系统。它以简洁直观的聊天式界面为特色,让用户能够像发送消息一样轻松地传输文件,无需复杂的设置或登录。Flix 支持大文件和多种格式…...
深入解析嵌入式Linux系统架构:从Bootloader到用户空间
B站视频链接,请多多关注本人B站: 📌 Yocto项目实战教程:第二章 视频讲解 目录 第2章 Linux系统架构 2.1 GNU/Linux2.2 Bootloader2.3 内核空间2.4 用户空间 总结 第2章 Linux系统架构 {#linux系统架构} 嵌入式Linux系统是Linux内核的精简版…...
一句话,十分钟,一部片!
大家好!我是羊仔,专注AI工具、智能体、编程。 羊仔最近发现一个超有意思的AI工具,简直是为内容创作者量身打造的!啥工具?Story-Flicks! 这玩意儿能干啥呢?简单来说,一句话…...