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

C/C++数据结构之动态数组

概述

        与前一篇文章中介绍的静态数组不同,动态数组允许我们在运行时根据需要调整其大小。这意味着,数组元素的个数不是在编译时就固定的,而是可以在运行时指定。另外,我们还可以在程序执行过程中动态地添加或删除元素,而无需预先确定数组的最大容量。这种灵活性,使得动态数组非常适合用于那些数据量不确定或会随时间变化的场景。

        当我们在网上购物时,购物车就是运用动态数组的一个典型例子。我们可以不断地向购物车中添加商品,直到结账为止。即使不小心多加了某件商品,也可以轻松地从购物车中移除它。

声明与初始化

        声明一个动态数组,需要明确指定数组的类型,实际上是声明一个该类型的指针。声明格式通常如下:

        type *arrayName;

        其中,type代表数组中元素的数据类型(比如:int、float等)。

        在声明数组的同时,还可以对数组进行初始化。初始化时,需要使用new操作符来分配内存,形式如下:

        type *arrayName = new type[size];

        其中,size可以是任何有效的常量、变量和表达式。需要特别注意的是:使用完动态数组后,我们应该记得使用delete[]来释放所分配的内存,以防止内存泄漏。可参考下面的示例代码。

int nSize = 66;
int *paNumber = new int[nSize];
delete [] paNumber;

基本操作

        对动态数组进行访问、修改、遍历等基本操作,与静态数组基本类似,这里就不再赘述了。

        接下来,我们重点介绍下动态数组如何根据需要自动调整大小。在下面的示例代码中,我们定义了一个名为CDynamicArray的类,它包含了添加元素的方法AddItem。当数组达到其容量限制时,该方法会自动扩展数组容量,通常是将容量翻倍。

class CDynamicArray
{
public:CDynamicArray() : m_pData(NULL), m_nCapacity(0), m_nSize(0) {}~CDynamicArray(){delete[] m_pData;}void AddItem(int nValue){if(m_nSize == m_nCapacity){// 如果数组已满,则扩展容量int nCapacityNew = (m_nCapacity == 0) ? 6 : m_nCapacity * 2;int* pData = new int[nCapacityNew];// 将旧数组的值复制到新数组for(int i = 0; i < m_nSize; ++i){pData[i] = m_pData[i];}// 释放旧数组并更新指针和容量delete[] m_pData;m_pData = pData;m_nCapacity = nCapacityNew;}// 添加新元素m_pData[m_nSize++] = nValue;}private:int* m_pData;      // 指向动态数组的指针int m_nCapacity;   // 数组的当前容量int m_nSize;       // 当前数组中的元素数量
};

总结

        使用动态数组的主要好处是:能够有效地管理内存。由于其大小可以根据实际需求进行调整,因此可以避免浪费过多的内存空间。比如:在处理用户输入的数据时,我们无法事先知道用户会输入多少条记录,这时候动态数组就能派上用场了。另外,通过动态分配和释放内存,还可以优化程序的性能,提高资源的利用率。

        然而,动态数组也有其局限性。最明显的就是效率问题:每次调整大小时,都可能涉及到内存的重新分配,这是一项相对耗时的操作。另外,频繁地增减元素,还可能导致内存碎片的问题。

http://www.xdnf.cn/news/14695.html

相关文章:

  • ali PaddleNLP docker
  • vue-31(Nuxt.js 中的数据获取:asyncData和fetch)
  • XIP (eXecute In Place)
  • Spring AI Alibaba Nacos 集成实践
  • 【C++ 基础】 C++ 与 C 语言差异面试题(附大厂真题解析)
  • 【智能协同云图库】智能协同云图库第三弹:基于腾讯云 COS 对象存储—开发图片模块
  • 【Linux高级全栈开发】2.3.1 协程设计原理与汇编实现2.3.2 协程调度器实现与性能测试
  • 原型设计Axure RP网盘资源下载与安装教程共享
  • 【记录】服务器多用户共享Conda环境——Ubuntu24.04
  • 进阶向:Django入门,从零开始构建一个Web应用
  • Word之电子章制作——1
  • kubectl exec 原理
  • 力扣第73题-矩阵置零
  • Flutter基础(Children|​​Actions|Container|decoration|child)
  • git使用详解和示例
  • 【区块链】区块链交易(Transaction)之nonce
  • 【Docker基础】Docker容器管理:docker stats及其参数详解
  • C++共享型智能指针std::shared_ptr使用介绍
  • 机器学习配置环境
  • 某音Web端消息体ProtoBuf结构解析
  • 力扣 刷题(第七十一天)
  • 第七章——一元函数微分学的物理应用
  • 多表连接查询:语法、注意事项与最佳实践
  • 如何快速学习一门新编程语言
  • 【Linux】理解进程状态与优先级:操作系统中的调度原理
  • STM32HAL 旋转编码器教程
  • 自定义上下两个方向的柱形图
  • Vue.js 中的数字格式化组件:`FormattedNumber`
  • Note2.4 机器学习:Batch Normalization Introduction
  • 栅极驱动器选的好SiC MOSFET高效又安全