数据结构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.rhkb.cn/news/373920.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【测试设计】使用jenkins 插件Allure生成自动化测试报告

前言 以前做自动化测试的时候一直用的HTMLTestRunner来生成测试报告&#xff0c;后来也尝试过用Python的PyH模块自己构建测试报告&#xff0c;在后来看到了RobotFramework的测试报告&#xff0c;感觉之前用的测试报告都太简陋&#xff0c;它才是测试报告应该有的样子。也就是在…

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习&#xff0c;话不多说&#xff0c;直接上货&#xff01;&#xff01;&#xff01; 1.第一个C程…

关于复现StableDiffusion相关项目时踩坑的记录

研究文生图也有了一段时间&#xff0c;复现的论文也算是不少&#xff0c;这篇博客主要记录我自己踩的坑。 目前实现文生图的项目主要分为两类&#xff1a; 一、基于Stable-diffusion原项目文件实现 原项目地址&#xff1a;https://github.com/Stability-AI/stablediffusion …

Android实现获取本机手机号码

和上次获取设备序列号一样&#xff0c;仍然是通过无障碍服务实现&#xff0c;在之前的代码基础上做了更新。代码和demo如下&#xff1a; package com.zwxuf.lib.devicehelper;import android.accessibilityservice.AccessibilityService; import android.app.Activity; import…

Everything搜索无法搜索到桌面的文件(无法检索C盘 或 特定路径的文件)

现象描述 在Everything搜索框中输入桌面已存在的文件或随便已知位置的文件&#xff0c;无法找到。 搜索时检索结果中明显缺少部分磁盘位置的&#xff0c;例如无法检索C盘&#xff0c;任意关键字搜索时结果中没有位于C盘的&#xff0c;无论怎样都搜不到C盘文件。 解决方法 在…

Flutter——最详细(Table)网格、表格组件使用教程

背景 用于展示表格组件&#xff0c;可指定线宽、列宽、文字方向等属性 属性作用columnWidths列的宽度defaultVerticalAlignment网格内部组件摆放方向border网格样式修改children表格里面的组件textDirection文本排序方向 import package:flutter/material.dart;class CustomTa…

还没听说过IOC你就out了!融合IOC的可视化大屏重塑校园管理模式

一.IOC到底是个啥东西 在数字孪生中&#xff0c;IOC&#xff08;物联网操作中心&#xff09;是指一个中心化的平台或系统&#xff0c;用于监控、管理和控制物联网设备和系统。在智慧校园建设中用于集成、管理和优化校园各类数据和资源的中心化平台。它通常采用先进的信息技术和…

防火墙之安全策略

目录 前言&#xff1a; 一、实验需求 二、需求分析 三、具体操作 1&#xff0c;在安全区域中新建拓扑图中所显示的区域 2&#xff0c;在对象模块中的时间段中添加一个9&#xff1a;00-18&#xff1a;00 3&#xff0c;写两条安全策略&#xff0c;一个是生产区&#xff0c…

解决Invalid or unsupported by client SCRAM mechanisms(dbeaver)

在用工具&#xff08;dbeaver&#xff09;链接Opengauss数据库的时候&#xff0c;报出标题的错误。原因为驱动不正确。 驱动下载地址&#xff1a;https://opengauss.org/zh/download/ 下载完的包 &#xff0c;解压后&#xff0c;里面应该有两个jar 包,使用postgresql.jar dbe…

AWS 云安全性:检测 SSH 暴力攻击

由于开源、低成本、可靠性和灵活性等优势&#xff0c;云基础设施主要由基于linux的机器主导&#xff0c;然而&#xff0c;它们也不能幸免于黑客的攻击&#xff0c;从而影响云的安全性。攻击Linux机器最流行的方法之一是通过SSH通道。 什么是 SSH 安全外壳协议&#xff08;Sec…

进程间的通信--管道

文章目录 一、进程通信的介绍1.1进程间为什么需要通信1.2进程如何通信 二、管道2.1匿名管道2.1.1文件描述符理解管道2.1.2接口使用2.1.3管道的4种情况2.1.4管道的五种特征 2.2管道的使用场景2.2.1命令行中的管道2.2.2进程池 2.命名管道2.1.1原理2.2.2接口2.2.3代码实例 一、进程…

论文 | Chain-of-Thought Prompting Elicits Reasoningin Large Language Models 思维链

这篇论文研究了如何通过生成一系列中间推理步骤&#xff08;即思维链&#xff09;来显著提高大型语言模型进行复杂推理的能力。论文展示了一种简单的方法&#xff0c;称为思维链提示&#xff0c;通过在提示中提供几个思维链示例来自然地激发这种推理能力。 主要发现&#xff1…

Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——RM & TM如何与TC建立连接 前言 看过官网 README 的第…

阶段三:项目开发---民航功能模块实现:任务24:航空实时监控

任务描述 内 容&#xff1a;地图展示、飞机飞行轨迹、扇区控制。航空实时监控&#xff0c;是飞机每秒发送坐标&#xff0c;经过终端转换实时发送给塔台&#xff0c;为了飞机位置的精准度&#xff0c;传输位置的密度很大&#xff0c;在地图位置显示不明显。本次为了案例展示效…

【C++深度学习】多态(概念虚函数抽象类)

✨ 疏影横斜水清浅&#xff0c;暗香浮动月黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

基于与STM32的加湿器之温湿度驱动

1.简介 温湿度计是一种用于测量和监测环境中温度和湿度的仪器&#xff0c;其工作原理基于热力学原理和物理原理。通过测量和显示环境中的温度和湿度&#xff0c;帮助用户了解当前环境的温湿度状况&#xff0c;从而采取相应的措施来调节或控制环境&#xff0c;以达到最佳的生产、…

Vue3入门之创建vue3的单页应用(vite+vue)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【测开能力提升-fastapi框架】介绍简单使用

0. 前期说明 立了很多flag(开了很多专题)&#xff0c;但坚持下来的没几个。也干了很多测试工作(起初是硬件(Acoustic方向)测试 - 业务功能测试 - 接口测试 - 平台功能测试 - 数据库测试 - py自动化测试 - 性能测试 - 嵌入式测试 - 到最后的python测试开发)&#xff0c;最终还是…

自定义枚举对象序列化规则: 在Json中以枚举的code值表示枚举;枚举序列化时,新增枚举描述字段;String到IEnum的转换

文章目录 引言I 案例分析1.1 接口签名计算1.2 请求对象1.3 枚举对象序列化1.4 创建JavaTimeModule以支持Java 8的时间日期类型序列化和反序列化1.5 请求对象默认值处理II 在JSON中以枚举的code值来表示枚举的实现方式2.1 自定义toString方法返回code2.2 使用@JsonValue注解,只…

Unity入门之重要组件和API(3) : Transform

前言 Transform类主要处理游戏对象(GameObject)的位移、旋转、缩放、父子关系和坐标转换。 1.位置和位移 1.1必备知识点&#xff1a;Vector3 Vector3 主要用来表示三维坐标系中的一个点或者一个向量。 【声明】 Vector3 v1 new Vector3(); Vector3 v2 new Vector3(10, 10…