c++之旅第十一弹——顺序表
大家好啊,这里是c++之旅第十一弹,跟随我的步伐来开始这一篇的学习吧!
如果有知识性错误,欢迎各位指正!!一起加油!!
创作不易,希望大家多多支持哦!

一,数据结构的概念:
1.什么是数据结构?
数据结构是指计算机存储和组织数据的方式
使用合理的数据结构能够提高程序的运行效率,内存利用率等
2.数据结构的两个层次:
(1)逻辑结构:分为线性和非线性两种,线性即为没有分支的一个接着一个,非线性即为有分支或无逻辑上的连续关系
(2)存储结构:
①线性:分为连续存储(数组)和链式存储(链表)
②非线性:索引存储和散列存储
二,顺序表:
1.属于线性表中的连续存储型
2.顺序表的特点:
(1)、因为地址是连续的所以可以通过下标(索引)访问
(2)、顺序表可以是静态(静态定好大小的数组)也可以是动态(用指针来开辟的空间)
(3)、顺序表随机访问方便,但是插入和删除中间的数据比较困难
3.顺序表的功能实现及完善:(eg:数组的增删查改)
类模板的使用可以避免每一次使用时需要写逻辑代码:
头文件CMyArray.h内容如下:
template <class T>//typename可以用来替换class
class CMyArray
{T *pBuff;size_t maxSize;size_t len;
public:CMyArray();CMyArray(CMyArray const& other);~CMyArray();
public:void push_back(T const& elem);//尾部添加void insert(int index, T const& elem);//在index位置插入void pop_back();//尾部删除void erase(int index);//删除index位置的值T& at(int index);//得到下标index的值int find(T const& elem) const;//查找参数是否在数组中
public:bool empty() const;//判断当前数组是否是空size_t size() const;//得到当前数组元素个数size_t maxLen() const;//得到当前数组可以存放的最大元素个数
private:void _resetMemory();//扩容内存
};
template <class T>
void CMyArray<T>::_resetMemory()
{if (len >= maxSize){maxSize += (maxSize >> 1) > 1 ? (maxSize >> 1) : 1;T *pTemp = new T[maxSize];for (size_t i = 0; i < len; ++i)pTemp[i] = pBuff[i];if (pBuff) delete[] pBuff;pBuff = pTemp;}
}
template <class T>
size_t CMyArray<T>::maxLen() const
{return maxSize;
}
template <class T>
size_t CMyArray<T>::size() const
{return len;
}
template <class T>
bool CMyArray<T>::empty() const
{return len == 0;//return pBuff == nullptr;//使用这个可能有指针指向的内存为未知而不是空的情况,而此时数组实际为空了,所以用上面那个方式更准确
}
template <class T>
int CMyArray<T>::find(T const& elem) const
{for (size_t i = 0; i < len; ++i){if (pBuff[i] == elem)return i;}return -1;
}
template <class T>
T& CMyArray<T>::at(int index)
{if (index < 0 || index >= (int)len)throw "out_of_range";return pBuff[index];
}
template <class T>
void CMyArray<T>::erase(int index)
{if (index < 0 || index >= (int)len)throw "out_of_range";for (size_t i = index; i < len; ++i)pBuff[i] = pBuff[i + 1];len--;
}
template <class T>
void CMyArray<T>::pop_back()
{len--;
}
template <class T>
void CMyArray<T>::insert(int index, T const& elem)
{if (index < 0 || index >= (int)maxSize)throw "out_of_range";//if (len >= maxSize)//{// maxSize += (maxSize >> 1) > 1 ? (maxSize >> 1) : 1;// T *pTemp = new T[maxSize];// for (size_t i = 0; i < len; ++i)// pTemp[i] = pBuff[i];// if (pBuff) delete[] pBuff;// pBuff = pTemp;//}//重复内容进行了封装 _resetMemory();
for (int i = (int)len - 1; i >= index; --i)pBuff[i + 1] = pBuff[i];pBuff[index] = elem;len++;
}
template <class T>
void CMyArray<T>::push_back(T const& elem)
{//if (len >= maxSize)//{// maxSize += (maxSize >> 1) > 1 ? (maxSize >> 1) : 1;// T *pTemp = new T[maxSize];// for (size_t i = 0; i < len; ++i)// pTemp[i] = pBuff[i];// if (pBuff) delete[] pBuff;// pBuff = pTemp;//}_resetMemory();pBuff[len++] = elem;
}
template <class T>
CMyArray<T>::CMyArray(CMyArray const& other)
{maxSize = other.maxSize;len = other.len;pBuff = nullptr;if (other.pBuff){pBuff = new T[maxSize];for (size_t i = 0; i < len; ++i)pBuff[i] = other.pBuff[i];}
}
template <class T>
CMyArray<T>::~CMyArray()
{if (pBuff)delete[] pBuff;pBuff = nullptr;maxSize = len = 0;
}
template <class T>
CMyArray<T>::CMyArray()
{pBuff = nullptr;maxSize = len = 0;
}
.cpp文件内容如下:
#include "CMyArray.h"
void main()
{CMyArray<int> ma;for (int i = 0; i < 10; ++i)ma.push_back(i + 1);ma.insert(1, 123);ma.pop_back();ma.erase(3);for (size_t i = 0; i < ma.size(); ++i)printf("%d\t",ma.at(i));printf("\n");
}
相关文章:
c++之旅第十一弹——顺序表
大家好啊,这里是c之旅第十一弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,数据结构…...
深入了解 PXE:定义、架构、原理、应用场景及常见命令体系
引言 PXE(Preboot Execution Environment,预启动执行环境)是一种允许计算机通过网络启动操作系统而无需本地存储设备的技术。本文将详细介绍 PXE 的定义、架构、原理、应用场景及常见命令体系,特别是以 CentOS 为例,展…...
《每天5分钟用Flask搭建一个管理系统》第9章:API设计
第9章:API设计 9.1 RESTful API的概念 RESTful API是一种基于HTTP协议的网络服务接口设计方法,它使用标准的HTTP方法,如GET、POST、PUT、DELETE等,来执行资源的操作。 9.2 Flask-RESTful扩展的使用 Flask-RESTful是一个Flask扩…...
CCM的作用及原理
CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后,就是当AWB将白色校正之后其他颜色也会跟着有明显变化,CCM的作用就是要保持白色不变,把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…...
10.09面试题目记录
艾融软件 - 线上面试题 排序算法的时间复杂度 O(n^2):冒泡,选择,插入 O(logn):折半插入排序 O(nlogn):希尔,归并,快速,堆 O(nk):桶,…...
14-29 剑和诗人3 – 利用知识图谱增强 LLM 推理能力
知识图谱提供了一种结构化的方式来表示现实世界的事实及其关系。通过将知识图谱整合到大型语言模型中,我们可以增强它们的事实知识和推理能力。让我们探索如何实现这一点。 知识图谱构建 在利用知识图谱进行语言模型增强之前,我们需要从可靠的来源构建…...
【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样
文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数(Days-in-Month Example)4 【示例2】确定保险费率(Insurance Rates Example)5 【示例3】灵活的消息格式(Flexible-Message-Format …...
深度学习 --- stanford cs231学习笔记八(训练神经网络之dropout)
6,dropout 6,1 线性分类器中的正则化 在线性分类器中,我们提到过正则化,其目的就是为了防止过度拟合。例如,当我们要用一条curve去拟合一些散点的数据时,常常是不希望训练出来的curve过所有的点,…...
【C++】 解决 C++ 语言报错:Undefined Reference
文章目录 引言 未定义引用(Undefined Reference)是 C 编程中常见的错误之一,通常在链接阶段出现。当编译器无法找到函数或变量的定义时,就会引发未定义引用错误。这种错误会阻止生成可执行文件,影响程序的正常构建。本…...
【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer
阅读时间:2023-12-20 1 介绍 年份:2022 作者:Lina M. Tran,Adam Santoro,谷歌DeepMind 期刊: Proceedings of the National Academy of Sciences 引用量:13 代码:https://github.c…...
在Spring Boot项目中引入本地JAR包的步骤和配置
在Spring Boot项目中,有时需要引入本地JAR包以便重用已有的代码库或者第三方库。本文将详细介绍如何在Spring Boot项目中引入本地JAR包的步骤和配置,并提供相应的代码示例。 1. 为什么需要本地JAR包 在开发过程中,可能会遇到以下情况需要使…...
Android Studio中使用命令行gradle查看签名信息
Android Studio中使用命令行gradle查看签名信息: 使用 Gradle 插件生成签名报告 打开 Android Studio 的 Terminal。 运行以下命令:./gradlew signingReport 将生成一个签名报告,其中包含 MD5、SHA1 和 SHA-256 的信息。 如果失败…...
昇思25天学习打卡营第5天 | 神经网络构建
1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同…...
Web缓存—Nginx和CDN应用
目录 一、代理的工作机制 二、概念 三、作用 四、常用的代理服务器 二.Nginx缓存代理服务器部署 1.在三台服务器上部署nginx 此处yum安装 2.准备测试界面 三、CDN概念及作用 1.CDN的工作过程 一、代理的工作机制 (1)代替客户机向网站请求数据…...
Linux 端口
什么是虚拟端口 计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序,确保程序之间进行沟通。 IP地址相当于小区地址,在小区内可以有许多用户(程序)&…...
菜鸡的原地踏步史02(◐‿◑)
每日一念 改掉自己想到哪写哪的坏习惯 二叉树 二叉树的中序遍历 class Solution {/**中序遍历左 - 中 - 右*/private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null) {return res;}tranve…...
实现Java应用的数据加密与解密技术
实现Java应用的数据加密与解密技术 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 数据加密与解密的重要性 数据安全是当今互联网应用开发中的重要问题之…...
赛博解压板
目录 开头程序程序的流程图程序的解压效果(暂无,但可以运行一下上面的代码)结尾 开头 大家好,我叫这是我58。今天,我们要看关于赛博解压板的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define ROW 6//ROW表示行数,可…...
微信小程序常用的事件
1.点击事件 WXML 中绑定点击事件: <!-- index.wxml --> <button bindtap"handleTap">点击我</button> 对应的 JS 文件中编写点击事件处理函数: // index.js Page({handleTap: function() {console.log(按钮被点击了);} }…...
js时间转成xx前
// 时间戳转多少分钟之前 export default function getDateDiff(dateTimeStamp) {// console.log(dateTimeStamp,dateTimeStamp)// 时间字符串转时间戳var timestamp new Date(dateTimeStamp).getTime();var minute 1000 * 60;var hour minute * 60;var day hour * 24;var …...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...
2025-06-08-深度学习网络介绍(语义分割,实例分割,目标检测)
深度学习网络介绍(语义分割,实例分割,目标检测) 前言 在开始这篇文章之前,我们得首先弄明白,什么是图像分割? 我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程,即像素级别的…...
