数据结构与数组-线性表 📅 发布时间:2026/7/8 19:34:43 👁️ 浏览次数: 数组特点内存是连续的优点·下标访问随机访问时间复杂度是O(1)不是查找、搜索是arr[0]的访问·末尾位置增删元素的时间复杂度是O(1)不涉及元素的移动·访问元素前后相邻位置的元素很方便缺点·非末尾位置增删元素需要移动大量的数据线性时间复杂度O(n)·搜索的时间复杂度是O(n)无序时线性搜索 O(n)有序时可以二分搜索降低复杂度 O(logn)·数组扩容消耗比较大程序运行时可用内存主要分为三部分数据段 .data存放全局变量的地方系统分配系统释放生命周期是整个程序的生命周期堆 heap通过new/delete来开辟/释放栈 stack随着函数的运行/结束 分配/释放由此可知如果想要手动控制数组内存扩容需要将数组定义在堆上。数组实现下面的代码构建了一个具有末位存储、末位释放、插入、删除、查询功能的数组类。在数组元素增加时通过内部的扩容函数实现数组扩容。在构建类或读类的代码时首先要确定成员变量。之后考虑构造函数的方法和析构函数的处理。释放内存时注意不要产生野指针。然后是成员函数要实现的功能。构建成员函数时要注意数据的安全性。#include iostream #include stdlib.h #include time.h using namespace std; //实现可扩容的数组 class Array { public: //函数构造 Array(int size 10) : mCur(0), mCap(size) //构造函数传递默认值10。在成员列表中给成员变量初始化 { mpArr new int[mCap](); //[]数组大小()表示每个元素初始化为0 } ~Array() //析构在对象销毁前释放掉占用的外部堆内存 { delete[]mpArr; //释放指针指向的堆内存空间 mpArr nullptr; //指针设置为空防止野指针出现 野指针指针非空但是指向的地址内存已经释放 } public: //实现接口 //末尾增加元素 O(1) void push_back(int val) { if (mCur mCap) { expand(2 * mCap); //O(n) } mpArr[mCur] val; } //末尾删除元素 void pop_back() { if (mCur 0) { return; } mCur--; } //按位置增加元素 void insert(int pos, int val) { if (pos 0 || pos mCur) //指定位置可行性判定 { throw pos invalid!; //return } if (mCur mCap) //判断是否需要扩容 { expand(2 * mCap); } //移动元素 for (int i mCur - 1; i pos; i--) { mpArr[i 1] mpArr[i]; } //插入元素 mpArr[pos] val; mCur; } //按位置删除 O(n) void erase(int pos) { //有效性判断 if (pos 0 || pos mCur) { throw pos invalid!; } //移动元素 for (int i pos; i mCur - 1; i) { mpArr[i] mpArr[i 1]; } mCur--; } //元素查询 int find(int val) { for (int i 0; i mCur; i) { if (mpArr[i] val) { return i; } } return -1; } //打印数据 void show()const { for (int i 0; i mCur; i) { cout mpArr[i] ; } cout endl; } private: //内部数组扩容接口 O(n) void expand(int size) { int* p new int[size]; //开辟一片新内存 memcpy(p, mpArr, sizeof(int) * mCap); //复制内存 delete[]mpArr; //释放原有内存 mpArr p; mCap size; } private: //成员变量 int* mpArr; //使用指针指向堆上可扩容的数组内存 int mCap; //记录数组的容量 int mCur; //数组有效元素个数 }; int main() { //用自定义的数组类定义一个对象 Array arr; //用系统时间设置一个随机数种子 srand(time(0)); //随机赋十个值给数组 for (int i 0; i 10; i) { arr.push_back(rand() % 100); } arr.show(); arr.pop_back(); arr.show(); arr.insert(0, 100); arr.show(); arr.insert(10, 200); arr.show(); int pos arr.find(100); if (pos ! -1) { arr.erase(pos); } arr.show(); return 0; }
Java 25模块化部署在飞腾D2000+麒麟V10 SP3环境崩溃复现与根因定位(JVM Crash日志逆向解析+module-graph可视化溯源) 第一章:Java 25模块化部署在国产化环境中的适配挑战全景Java 25正式引入了强制模块边界(Strong Module Boundaries)与运行时模块图快照(Runtime Module Graph Snapshot),这对依赖动态类加载、反射穿透或自定… 2026/7/9 11:48:10
快速上手AI股票分析:daily_stock_analysis镜像环境配置与功能体验 快速上手AI股票分析:daily_stock_analysis镜像环境配置与功能体验 1. 引言 想不想拥有一个随时待命的私人股票分析师?不用订阅昂贵的投研服务,也不用担心数据隐私泄露,一个完全运行在你本地的AI助手就能帮你分析任何感兴趣的股票… 2026/7/9 11:47:17
MGeo地址解析模型详解:MaSTS句子对预训练提升语义匹配精度 MGeo地址解析模型详解:MaSTS句子对预训练提升语义匹配精度 1. 引言:为什么地址解析这么难? 你有没有遇到过这样的场景?点外卖时,地址写的是“公司楼下那个红色的便利店对面”,外卖小哥转了三圈也找不到&a… 2026/5/17 10:34:11
告别繁琐命令行:三分钟掌握这款超简单的M3U8视频下载工具 告别繁琐命令行:三分钟掌握这款超简单的M3U8视频下载工具 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾经遇到过想要保存在线视频却无从下手的困扰… 2026/7/9 11:46:58
如何高效使用网盘直链下载助手:免费提升下载体验的实用指南 如何高效使用网盘直链下载助手:免费提升下载体验的实用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /… 2026/7/9 11:44:58
图形验证码接入效率与长期运维成本综合评估:自建方案与企讯通Qcaptcha等第三方服务的全链路对比 在互联网安全防护体系中,图形验证码始终扮演着"守门人"的关键角色。无论是账号登录、表单提交还是抢购下单,它都站在业务入口的第一线,拦截恶意攻击、暴力破解与批量请求。当前,企业在部署验证码能力时,通常… 2026/7/9 11:44:58
深度学习的梯度消失与梯度爆炸 深度学习的“成长烦恼”:系统解析梯度消失与梯度爆炸 在深度神经网络的训练过程中,梯度消失(Vanishing Gradient)与梯度爆炸(Exploding Gradient)是阻碍模型收敛的两大核心难题。这两个问题本质上源于反向传… 2026/7/9 11:42:58
抖音批量下载终极指南:免费开源工具助你高效管理内容 抖音批量下载终极指南:免费开源工具助你高效管理内容 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor… 2026/7/9 11:42:58
彻底搞懂 Young GC 与 Full GC:GC 日志逐行拆解 + 面试考点 前言 上周朋友面试复盘的时候,问:JVM 的 Young GC 和 Full GC 到底有什么本质区别?为什么有的大对象会直接进入老年代?GC 日志到底该怎么看懂? 以前只停留在“年轻代垃圾回收快、老年代回收慢”的浅层认知࿰… 2026/7/9 11:40:57
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比 GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M… 2026/7/9 0:03:06
【大数据毕业设计】基于多源旅游数据的景区热度分析与推荐系统的设计与实现 基于 Django 的旅游偏好挖掘与景区推荐系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 0:05:09
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08