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

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");
​
}

相关文章:

  • 常见网络攻击方式及防御方法
  • 图像处理中的二维傅里叶变换
  • 鸿蒙:1.入门
  • 十大排序:插入/希尔/选择/堆/冒泡/快速/归并/计数/基数/桶排序 汇总(C语言)
  • 【收藏级神丹】Liae384_刘亦菲_直播可用,平衡度最高的原创神丹,独家珍稀资源
  • Kafka集群安装部署
  • 嵌入式linux sqlite3读写demo
  • 【面试题】网络IO模型
  • 从0开始学习pyspark--Spark DataFrame数据的选取与访问[第5节]
  • jmeter-beanshell学习1-vars使用获取变量和设置变量
  • go内存返还系统相关代码
  • 001 进程和线程
  • Ruby 环境变量
  • 手写SpringMVC之调度器DispatcherServlet
  • Web3 ETF的主要功能
  • [笔记] php常见简单功能及函数
  • 「面试题」如何实现一个圣杯布局?
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【刷算法】从上往下打印二叉树
  • ES6--对象的扩展
  • Java,console输出实时的转向GUI textbox
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Markdown 语法简单说明
  • Nacos系列:Nacos的Java SDK使用
  • Python十分钟制作属于你自己的个性logo
  • Ruby 2.x 源代码分析:扩展 概述
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SpringBoot 实战 (三) | 配置文件详解
  • SwizzleMethod 黑魔法
  • Vue 重置组件到初始状态
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 大整数乘法-表格法
  • 悄悄地说一个bug
  • 一份游戏开发学习路线
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • # 数论-逆元
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma预处理命令
  • $(function(){})与(function($){....})(jQuery)的区别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (11)MSP430F5529 定时器B
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm高校实验室 毕业设计 800008
  • (南京观海微电子)——I3C协议介绍
  • (十一)图像的罗伯特梯度锐化
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (译)2019年前端性能优化清单 — 下篇
  • (转)用.Net的File控件上传文件的解决方案
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1