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

【C++数据结构】顺序存储结构的抽象实现

文章目录

  • 前言
  • 一、目标
  • 二、SeqList实现要点
  • 三、SeqList函数实现
    • 3.1 get函数
    • 3.2 set函数
    • 3.3 insert函数
      • 带2个参数的insert
      • 带一个参数的insert
    • 3.4 remove函数
    • 3.5 clear函数
    • 3.6 下标运算符重载函数
      • 无const版本
      • const版本
    • 3.7 length函数
  • 总结


前言

当谈到C++数据结构时,顺序存储结构是一个重要的概念。它是一种将数据元素按照其逻辑顺序依次存储在内存中的方式。这种存储方式使得元素在内存中是连续存储的,这有助于快速访问和操作数据。在本文中,我们将讨论顺序存储结构的抽象实现,以帮助您更好地理解它的原理和应用。

顺序存储结构是一种基本的数据结构,通常用于线性表(如数组)的表示。它有助于我们在计算机程序中存储和操作一系列数据元素,例如整数、字符、对象等。在顺序存储结构中,元素按照它们的逻辑顺序在内存中依次排列,这种存储方式使得元素的访问非常高效,因为我们可以通过索引快速定位任何元素。


一、目标

本节课要实现承上启下的一个非常重要的类:SeqList,当我们实现了他我们才会去实现我们具体的StaticList和DynamicList,所以他是非常重要的。那么我们上节课也已经介绍了实现流程如果不会的同学可以去看看上节课
在这里插入图片描述

二、SeqList实现要点

SedList 设计要点

  • 抽象类模板,存储空间的位置和大小由子类完成
  • 实现顺序存储结构线性表的关键操作 (增,删,查,等)
  • 提供数组操作符,方便快速获取元素
    那么我们可以抽象出下面这个类
template <typename T>
class SeqList :public List<T>
{T* m_array;//存储位置,由子类申请int m_length;//数组长度public:bool insert(const T& e);bool insert(int i, const T& e);bool remove(int i);bool set(int i, const T& e);bool get(int i, T& e) const;int length() const;void clear();T& operator[](int i);T operator[](int i)const;virtual int capacity() const = 0;
};

在这里插入图片描述

三、SeqList函数实现

3.1 get函数

顺序存储结构的元素获取操作

  • 判断目标位置是否合法
bool ret = ((0 <= i) && (i < m_length));

在这里插入图片描述

让我们来解释一下:

(0 <= i) 意味着 i 必须大于或等于0,因为在大多数编程中,位置通常从0开始编号,所以不能小于0。

(i < m_length) 意味着 i 必须小于线性表的长度 m_length。这是因为线性表中的位置索引不能超过线性表的总元素个数。

这两个条件一起的意思是,我们需要确保 i 不仅大于等于0,还要小于线性表的长度,这样我们才能访问线性表中有效的位置。如果 i 不满足这两个条件,那么访问它可能导致越界错误,这是一种非常常见的编程错误,因此需要进行这样的合法性检查,以防止程序出现问题。

  • 将目标位置作为数组下标获取元素
    因为我们这是原生数组,所以直接使用下标操作即可
e = m_array[i];

总体代码如下:

bool get(int i, T& e) const
{bool ret = ((0 <= i) && (i < m_length));if (ret){e = m_array[i];}return ret;
}

在这里插入图片描述

3.2 set函数

顺序存储结构的元素设置操作

  • 判断目标位置是否合法
bool ret = ((0 <= i) && (i < m_length));

在这里插入图片描述

让我们来解释一下:

(0 <= i) 意味着 i 必须大于或等于0,因为在大多数编程中,位置通常从0开始编号,所以不能小于0。

(i < m_length) 意味着 i 必须小于线性表的长度 m_length。这是因为线性表中的位置索引不能超过线性表的总元素个数。

这两个条件一起的意思是,我们需要确保 i 不仅大于等于0,还要小于线性表的长度,这样我们才能访问线性表中有效的位置。如果 i 不满足这两个条件,那么访问它可能导致越界错误,这是一种非常常见的编程错误,因此需要进行这样的合法性检查,以防止程序出现问题。

  • 将目标位置作为数组下标把参数设置进去
    因为我们这是原生数组,所以直接使用下标操作即可
m_array[i] = e;

总体代码如下:

bool set(int i, const T& e)
{bool ret = ((0 <= i) && (i < m_length));if (ret){m_array[i] = e;}return ret;
}

在这里插入图片描述

3.3 insert函数

带2个参数的insert

顺序存储结构的元素插入操作
1.判断目标位置是否合法

bool ret = ((0 <= i) && (i <= m_length));  // 1ret = ret && (m_length < capacity());  // 1

在这里插入图片描述

0 <= i 确保目标位置 i 不小于0,因为位置通常是从0开始计数的。
i <= m_length 保证目标位置 i 不超过线性表的当前长度,以免越界。
m_length < capacity() 确保线性表的长度没有超过它的容量,以防止插入元素导致溢出。
这两个步骤合在一起,就是在确认插入的位置 i 是一个有效、合法的位置,不会导致数组越界或者超过线性表的容量限制。

为什么是i <= m_length呢
拿出你的手,是不是一般有5个手指,那现在有一支笔要放到你手指中间有几种方式?
有6种,所以需要i<=m_length

2.将目标位置之后的所有元素后移一个位置

for(int p=m_length-1; p>=i; p--)   // n, 0
{m_array[p + 1] = m_array[p];
}

在这里插入图片描述

循环从线性表的最后一个元素开始,一直到目标位置 i。
m_array[p + 1] = m_array[p] 将每个元素向后移动一个位置,给插入的元素腾出空间。
这个步骤是为了给新元素腾出位置,确保插入操作不会覆盖掉原有的元素。通过将目标位置之后的元素都向后移动一个位置,为新元素腾出了插入的空间。这是线性表顺序存储结构中插入操作的一部分,确保插入后的线性表仍然是有序、没有元素遗漏的。

3.将新元素插入目标位置
4…线性表长度加 1

总体代码如下:

bool insert(int i, const T& e)
{bool ret = ((0 <= i) && (i <= m_length));ret = ret && (m_length < capacity());if (ret){for (int p = m_length - 1; p >= i; p--){m_array[p + 1] = m_array[p];}m_array[i] = e;m_length++;}return ret;
}

在这里插入图片描述

带一个参数的insert

那么这个函数设计出来干什么的呢?
其实就是方便我们尾插入的。

所以我们怎么实现他呢?
我们直接调用我们实现的2个参数的insert,且在位置的参数写上m_length,其意义就为尾插入

总体代码如下:

bool insert(const T& e) 
{insert(m_length, e);
}

在这里插入图片描述

3.4 remove函数

顺序存储结构的元素删除操作
1,判断目标位置是否合法

bool ret = ((0 <= i) && (i < m_length));

在这里插入图片描述

0 <= i 确保目标位置 i 不小于0,因为位置通常是从0开始计数的。
i < m_length 保证目标位置 i 不超过线性表的当前长度,以确保删除的位置是有效的。
这个步骤用于检查删除操作是否在合法的范围内进行,以防止删除不存在的元素或者越界。

2,将目标位置后的所有元素前移一个位置

for(int p=i; p<m_length-1; p++)   // n - 1{m_array[p] = m_array[p+1];}

在这里插入图片描述

循环从目标位置 i 开始,一直到线性表的倒数第二个元素(m_length-1位置)。
m_array[p] = m_array[p+1] 将每个元素向前移动一个位置,覆盖掉目标位置上的元素。
这个步骤是为了删除操作。通过将目标位置之后的元素都向前移动一个位置,可以覆盖掉要删除的元素,相当于将它从线性表中删除掉。删除后,线性表中的元素仍然是连续的,没有间隙,而且长度减少了一个元素。

3,线性表长度减 1

总体代码如下:

bool remove(int i)
{bool ret = ((0 <= i) && (i < m_length));if (ret){for (int p = i + 1; p < m_length-1; p++){m_array[p] = m_array[p + 1];}m_length--;}return ret;
}

在这里插入图片描述

3.5 clear函数

那么我们的clear操作是干什么的呢?
就是清空所有元素。

那么怎么实现呢?
可能有人知道,调用remove函数一个一个去删除。
那么这样的时间就会消耗更多。

我们不妨回到insert函数里面看看

在insert的实现中有这样一行代码,我们可以找到insert判断的条件的小技巧,直接把m_length设置0
那么我们是不是就变成初始状态了,所以就可以这样实现

bool ret = ((0 <= i) && (i <= m_length));

总体代码如下:

void clear()
{m_length = 0;
}

在这里插入图片描述

3.6 下标运算符重载函数

无const版本

我们的实现非常简单,和我们的get函数类似,只不过是我们需要在参数范围错误的时候抛出相应的异常即可

T& operator[](int i)
{if ((0 <= i) && (i < m_length)){return m_array[i];}elseTHROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid...");
}

在这里插入图片描述

const版本

其实我们的const和非const是一样的代码,我们完全可以直接复制过来,但是为了代码的复用性我们可以这样写:

T operator[](int i)const
{return const_cast<SeqList<T>&>(*this)[i];
}

在这里插入图片描述

我们使用了const_cast去除本类的const属性,使他变成了一个普通的对象,然后我们使用[]运算,就会调用我们没有const的下标重载运算符了

3.7 length函数

int length() const
{return m_length;
}

在这里插入图片描述


总结

顺序存储结构是一种在计算机编程中常见的数据结构,它允许我们有效地存储和操作一系列数据元素。通过使用数组或向量等数据结构,我们可以实现顺序存储结构的基本操作,如插入、删除、查找和遍历。这种存储方式在许多应用中都非常有用,例如列表、栈、队列等。了解顺序存储结构的抽象实现有助于我们更好地理解和应用数据结构的概念。希望本文能够帮助您更好地理解顺序存储结构的基本原理和应用。

相关文章:

【C++数据结构】顺序存储结构的抽象实现

文章目录 前言一、目标二、SeqList实现要点三、SeqList函数实现3.1 get函数3.2 set函数3.3 insert函数带2个参数的insert带一个参数的insert 3.4 remove函数3.5 clear函数3.6 下标运算符重载函数无const版本const版本 3.7 length函数 总结 前言 当谈到C数据结构时&#xff0c;…...

LeetCode75——Day31

文章目录 一、题目二、题解 一、题目 206. Reverse Linked List Given the head of a singly linked list, reverse the list, and return the reversed list. Example 1: Input: head [1,2,3,4,5] Output: [5,4,3,2,1] Example 2: Input: head [1,2] Output: [2,1] Exa…...

小白学爬虫:通过商品ID或商品链接封装接口获取淘宝商品销量数据接口|淘宝商品销量接口|淘宝月销量接口|淘宝总销量接口

淘宝商品销量接口是淘宝开放平台提供的一种API接口&#xff0c;通过该接口&#xff0c;商家可以获取到淘宝平台上的商品销量数据。使用淘宝商品销量接口的步骤如下&#xff1a; 1、在淘宝开放平台注册并创建应用&#xff0c;获取API Key和Secret Key等必要的信息。 2、根据淘宝…...

AI:75-基于生成对抗网络的虚拟现实场景增强

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

【MySQL数据库】| 索引以及背后的数据结构

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;MySQL数据库 &#x1f397;️ 如何优雅的活着&#xff0c;是我找寻的方向 目录 1. 基本知识2. 索引背后的数据结构总结 1. 基本知识 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有…...

家用电脑做服务器,本地服务器搭建,公网IP申请,路由器改桥接模式,拨号上网

先浇一盆冷水&#xff01; 我不知道其他运营商是什么情况。联通的运营商公网IP端口 80、8080、443 都会被屏蔽掉&#xff0c;想要开放必须企业备案&#xff08;个人不行&#xff09;才可以。也就是说&#xff0c;只能通过其他端口进行showtime了。 需要哪些东西&#xff1f; 申…...

原神游戏干货分享:探索璃月的宝箱秘密,提高游戏资源获取效率!

《原神》是一款备受玩家喜爱的开放世界冒险游戏&#xff0c;而在游戏中获取资源是提升角色实力的重要途径。在这篇实用干货分享中&#xff0c;我们将介绍一些探索璃月地区的宝箱秘密&#xff0c;帮助你提高游戏资源获取的效率。 首先&#xff0c;璃月地区的宝箱分为普通宝箱和精…...

idea 2023 设置启动参数、单元测试启动参数

找到上方的editconfigration&#xff0c; 如下图&#xff0c;如果想在启动类上加&#xff0c;就选择springboot&#xff0c;如果想在单元测试加&#xff0c;就选择junit 在参数栏设置参数&#xff0c;多个参数以空格隔开 如果没有这一栏&#xff0c;就选择就可以了。 然后&…...

RSA加密算法(后端)

public class RSA {private static final String RSA_ALGORITHM "RSA";/*** 生成RSA密钥对** return RSA密钥对*/public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(RSA…...

挑战100天 AI In LeetCode Day08(热题+面试经典150题)

挑战100天 AI In LeetCode Day08&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-102.1 题目2.2 题解 三、面试经典 150 题-103.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…...

地铁机电设备健康管理现状及改善方法

轨道交通和我们的生活息息相关&#xff0c;从火车到地铁再到轻轨&#xff0c;给人们的出行带来了很大的便利。因此&#xff0c;保障轨道交通的的正常运行和安全至关重要&#xff0c;需要运维人员及时排查设备的问题&#xff0c;解决故障&#xff0c;保证轨道交通的安全运行。本…...

安卓NDK开发

1、jni&#xff1a;java native interface 作用&#xff1a;用于java代码和C、c代码的交互&#xff08;代码混编&#xff09;&#xff1b; 分类使用&#xff1a;Jni静态注册、jni动态注册 2、静态注册 1&#xff09;.绑定java方法和C/C方法的方式之一&#xff1b; …...

高性能网络编程 - 解读5种I/O模型

文章目录 服务端处理网络请求流程图基础概念阻塞调用 vs 非阻塞调用同步处理 vs 异步处理阻塞、非阻塞 和 同步、异步的区别recvfrom 函数 五种I/O模型I/O模型1&#xff1a;阻塞式 I/O 模型(blocking I/O&#xff09;I/O模型2&#xff1a;非阻塞式 I/O 模型(non-blocking I/O&a…...

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程&#xff0c;一度被错误的目标误导&#xff0c;花费大量功夫后才找到问题点所在&#xff0c;成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪&#xff08;…...

【uniapp】通用列表封装组件

uniapp页面一般都会有像以下的列表页面&#xff0c;封装通用组件&#xff0c;提高开发效率&#xff1b; &#xff08;基于uView前端框架&#xff09; 首先&#xff0c;通过设计图来分析一下页面展示和数据结构定义 w-table组件参数说明 参数说明类型可选值默认值toggle列表是…...

17 Linux 中断

一、Linux 中断简介 1. Linux 中断 API 函数 ① 中断号 每个中断都有一个中断号&#xff0c;通过中断号可以区分出不同的中断。在 Linux 内核中使用一个 int 变量表示中断号。 ② request_irq 函数 在 Linux 中想要使用某个中断是需要申请的&#xff0c;request_irq 函数就是…...

微信小程序真机调试连接状态一直在正常和未链接之间反复横跳?

背景&#xff1a;小程序真机调试的时候&#xff0c;发现真机的network不显示接口调用情况&#xff0c;控制台也没有输出内容。具体如下所示&#xff1b; 解决方法&#xff1a; 1、确保手机端连接的网络和微信开发者工具网络一致&#xff0c;比如用同一个WiFi 2、真机自动调试…...

最新Next 14快速上手基础部分

最新Next 14快速上手基础部分 最新的NEXT快速上手文档&#xff0c;2023.10.27 英文官网同步&#xff0c;版本Next14.0.0 本项目案例&#xff1a;GitHub地址&#xff0c;可以根据git回滚代码到对应知识&#xff0c;若有错误&#xff0c;欢迎指正&#xff01; 一、介绍 1.什么是…...

【uniapp/uview】Collapse 折叠面板更改右侧小箭头图标

最终效果是这样的&#xff1a; 官方没有给出相关配置项&#xff0c;后来发现小箭头不是 uview 的图标&#xff0c;而是 unicode 编码&#xff0c;具体代码&#xff1a; // 箭头图标 ::v-deep .uicon-arrow-down[data-v-6e20bb40]:before {content: \1f783; }附一个查询其他 u…...

企业如何落地搭建商业智能BI系统

随着新一代信息化、数字化技术的应用&#xff0c;引发了新一轮的科技革命&#xff0c;现代化社会和数字化的联系越来越紧密&#xff0c;数据也变成继土地、劳动力、资本、技术之后的第五大生产要素&#xff0c;这一切都表明世界已经找准未来方向&#xff0c;前沿科技也与落地并…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...