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

数据结构1:C++实现变长数组

数组作为线性表的一种,具有内存连续这一特点,可以通过下标访问元素,并且下标访问的时间复杂的是O(1),在数组的末尾插入和删除元素的时间复杂度同样是O(1),我们使用C++实现一个简单的边长数组。

数据结构定义

class Array
{
int cur;
int cap;
int *tail;
};

cur是当前元素的个数,cap是数组的总容量,tail是数组最后一个元素的下一个空间地址。

数组接口定义

#include<iostream>
#include<stdlib.h>
#include<time.h>
class Array
{
private:
int cur;
int cap;
int *tail;
void expand(int size);
public:
Array(int size=15);
~Array();// 末尾增加元素void push_back(int val);// 末尾删除元素void pop_back();// 按位置增加元素void insert(int pos, int val);// 按位置删除void erase(int pos);// 元素查询int find(int val);// 打印数据void show()const;
};

这里的expand函数用于给数组扩容,由于扩容操作是由C++标准库的函数实现的(参考vector),因此我们将expand函数使用private关键字修饰,代表这个函数只能被Array自身使用。

函数实现

#include<iostream>
#include<stdlib.h>
#include<time.h>
class Array
{
private:
int cur;
int cap;
int *tail;
void expand(int size)
{int *p=new int[size*sizeof(int)];memcpy(p,tail,size);delete tail;tail=p;cap=size;
}
public:
Array(int size=15):cap(size),cur(0)
{tail=new int[size];
}
~Array()
{delete []tail;tail=nullptr;//防止产生野指针
}// 末尾增加元素void push_back(int val){if(cur>=cap){expand(2*cap);}tail[cur++]=val;}// 末尾删除元素void pop_back(){if(cur==0)return;cur--;}// 按位置增加元素void insert(int pos, int val){if(pos<0||pos>cur)return;if(cur>=cap)expand(2*cap);for(int i=cur-1;i>=pos;i--){tail[i+1]=tail[i];}tail[pos]=val;cur++;}// 按位置删除void erase(int pos){if(pos<0||pos>cur||cur==0)return;for(int i=pos+1;i<cur;i++){tail[i-1]=tail[i];}cur--;}// 元素查询int find(int val){for(int i=0;i<cur;i++){if(tail[i]==val)return i;}return -1;}// 打印数据void show()const{for(int i=0;i<cur;i++){std::cout<<tail[i]<<" ";}std::cout<<std::endl;}
};

接口测试

int main()
{Array array;srand(time(0));for(int i=0;i<10;i++){array.push_back(rand()%100);}array.show();array.insert(1,100);array.show();array.pop_back();array.show();array.erase(2);array.show();std::cout<<array.find(100);
}

输出结果

http://www.lryc.cn/news/396840.html

相关文章:

  • C++入门基础篇(下)
  • LabVIEW图像分段线性映射
  • Linux开发:进程件通过UDS传递内存文件句柄
  • Internet Download Manager6.42最新下载器互联网冲浪小能手们!
  • Vue 使用Audio或AudioContext播放本地音频
  • 从数据仓库到数据湖(上):数据湖导论
  • Perl 语言开发(六):深入探索 Perl 中的数组与列表操作
  • 统一视频接入平台LntonCVS视频监控平台具体功能介绍
  • redis的Bitmap 、HyperLogLog、Geo相关命令和相关场景
  • ✅小程序申请+备案教程
  • Google Guava Cache简介
  • githup开了代理push不上去
  • 【python】保存列表、字典数据到本地文件,以txt、json和pickle为例
  • 每日新闻掌握【2024年7月9日 星期二】
  • 数据结构——Trie
  • 前端根据目录生成模块化路由routes
  • Blender新手入门笔记收容所(一)
  • 修改服务器挂载目录
  • Linux+InternStudio 关卡
  • 如何提升美国Facebook直播的整体体验?
  • flutter项目与原生项目相比,性能比较差的原因
  • 第二周:李宏毅机器学习笔记
  • 搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件
  • 网络编程:各协议头(数据报格式)
  • SpringBoot报错:The field file exceeds its maximum permitted size of 1048576 bytes
  • C++的介绍与认识
  • Spark源码详解
  • 浅尝Apache Mesos
  • buuctf题目讲解-1
  • 软件测试学习之-ADB命令