c++之旅第十一弹——顺序表

news2024/11/26 11:50:32

大家好啊,这里是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");
​
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1897749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统(CentOS)安装Mysql5.7.x

安装准备&#xff1a; Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下载mysql安装文件&#xff08;mysql-5.7.44为例&#xff09; 选择Linux通用版本64位&#xff08;L…

2024年保安员职业资格考试题库大数据揭秘,冲刺高分!

186.安全技术防范是一种由探测、&#xff08;&#xff09;、快速反应相结合的安全防范体系。 A.保安 B.出警 C.延迟 D.监控 答案&#xff1a;C 187.安全技术防范是以&#xff08;&#xff09;和预防犯罪为目的的一项社会公共安全业务。 A.预防灾害 B.预防损失 C.预防失…

昇思25天学习打卡营第5天 | 神经网络构建

1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不同…

MobaXterm不显示隐藏文件

MobaXterm在左边显示隐藏文件&#xff0c;以.开头的文件&#xff0c;想让它不显示&#xff0c;点击红框按钮就可以了

计算机视觉——opencv快速入门(二) 图像的基本操作

前言 上一篇文章中我们介绍了如何配置opencv&#xff0c;而在这篇文章我们主要介绍的是如何使用opencv来是实现一些常见的图像操作。 图像的读取&#xff0c;显示与存储 读取图像文件 在opencv中我们利用imread函数来读取图像文件,函数语法如下&#xff1a; imagecv2.imre…

Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO

官网&#xff1a;https://streamlit.io/ github&#xff1a;https://github.com/streamlit/streamlit API 参考&#xff1a;https://docs.streamlit.io/library/api-reference 最全 Streamlit 教程&#xff1a;https://juejin.cn/column/7265946243196436520 Streamlit-中文文档…

如何在 Ubuntu上搭建 LAMP

远程登录 Ubuntu系统环境 ssh (User)(IP) # 比如&#xff1a;ssh lennlouis192.168.207.128 为安全起见&#xff0c;建议你使用 root 登录 VPS 后创建一个具有 sudo 权限的帐号。 安装和配置 Apache 2 Apache Http Server 是一个开源的&#xff0c;非常流行&#xff0c;使用…

直播预告 | VMware大规模迁移实战,HyperMotion助力业务高效迁移

2006年核高基专项启动&#xff0c;2022年国家79号文件要求2027年央国企100%完成信创改造……国家一系列信创改造政策的推动&#xff0c;让服务器虚拟化软件巨头VMware在中国的市场份额迅速缩水。 加之VMware永久授权的取消和部分软件组件销售策略的变更&#xff0c;导致VMware…

QoS-优先级映射

拓扑图 配置 先完成此配置复杂流分类-CSDN博客 配置qos map-table 接口开启信任DSCP qos map-table dscp-lpinput 32 output 5input 46 output 6 # interface GigabitEthernet0/0/0trust dscp override # AR1上10.1.1.1 ping 3.3.3.3&#xff0c;该流量标记为EF EF映射为p…

vs 远程链接ssh 开发 简单实验

1.概要 动态编译语言&#xff0c;跨平台必须做分别的编译&#xff0c;比如linux和windows。如何再windows环境下开发编译出linux平台的程序呢&#xff0c;vs支持远程链接编辑&#xff0c;就是再vs中写代码&#xff0c;但是编译确是链接远程的环境编译的。 2.环境准备 2.1 vs…

DataWhale-吃瓜教程学习笔记 (七)

学习视频**&#xff1a;第6章-支持向量机_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第六章 支持向量机 - 算法原理 几何角度 对于线性可分数据集&#xff0c;找距离正负样本距离都最远的超平面&#xff0c;解是唯一的&#xff0c;泛化性能较好 - 超平面 - 几何间隔 例…

如何让自动化测试更加灵活简洁?

简化的架构对于自动化测试和主代码一样重要。冗余和不灵活性可能会导致一些问题&#xff1a;比如 UI 中的任何更改都需要更新多个文件&#xff0c;测试可能在功能上相互重复&#xff0c;并且支持新功能可能会变成一项耗时且有挑战性的工作来适应现有测试。 页面对象模式如何理…

前后端数据交互流程

一、前言 用户在浏览器访问一个网站时&#xff0c;会有前后端数据交互的过程&#xff0c;前后端数据交互也有几种的情况&#xff0c;一下就简单的来说明一下 二、原理 介绍前后端交互前先来了解一下浏览器的功能&#xff0c;浏览器通过渲染引擎和 JavaScript 引擎协同工作&am…

东北财税之星:董女士的家乡创业记

乐财业智慧财税赋能平台&#xff0c;是一个帮助财税机构专业提升、业务增长&#xff0c;让财税生意更好做的综合赋能平台。聚焦财税公司业绩增长&#xff0c;预计2027年帮助2000家财税合伙人利润增长300%&#xff0c;致力打造轻量化、批量化、智能化的”业财税“一体财税服务生…

【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树

目录 1 -> 底层结构 2 -> AVL树 2.1 -> AVL树的概念 2.2 -> AVL树节点的定义 2.3 -> AVL树的插入 2.4 -> AVL树的旋转 2.5 -> AVL树的验证 2.6 -> AVL树的性能 1 -> 底层结构 在上文中对对map/multimap/set/multiset进行了简单的介绍&…

从CPU的视角看C++的构造函数和this指针

从汇编角度&#xff0c;清晰的去看构造函数和this指针到底是个什么东西呢&#xff1f;也许可以解决你的一点小疑问 首先写一个很简单的代码demo&#xff1a; class A{ public:int a;A(){;}void seta(int _a){a_a;}A* getA(){return this;} };int fun1(int px){return px; }in…

烟台LP-SCADA系统如何实现实时监控和过程控制?

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 LP-SCADA&#xff08;监控控制与数据采集&#xff09;系统实现实时监控和过程控制的主要原理和组件如下&#xff1a; 数据采集&#xff1a;LP-SCADA系统通过部署在现场的传…

跨境人最怕的封店要怎么规避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP关联、无版权售卖、虚假发货等等&#xff0c;其中IP关联这个问题导致店铺被封在跨境商家中简直是屡见不鲜 IP关联&#xff0c;是指被海外平台检测到多家店铺开设在同一个站点上的情况。我们知道有些…

用html+css设计一个列表清单小卡片

目录 简介: 效果图: 源代码: 可能的问题: 简介: 这个HTML代码片段是一个简单的列表清单设计。它包含一个卡片元素(class为"card"),内部包含一个无序列表(ul),列表项(li)前面有一个特殊的符号(△)。整个卡片元素设计成300px宽,150px高,具有圆角边…

Linux-C语言实现一个进度条小项目

如何在linux中用C语言写一个项目来实现进度条&#xff1f;&#xff08;如下图所示&#xff09; 我们知道\r是回车&#xff0c;\n是换行&#xff08;且会刷新&#xff09; 我们可以用 \r 将光标移回行首&#xff0c;重新打印一样格式的内容&#xff0c;覆盖旧的内容&#xff0c;…