一、动态数组概述
动态数组是一种可以动态增加或减少大小的数据结构,它可以根据需要实时改变数组大小。动态数组可以在程序运行时根据需求分配内存,相比于静态数组,这样可以更好的控制内存的使用,同时可以减少浪费。
二、动态数组实现原理
实现一个动态数组需要维护一个指针,指向当前动态数组中的内存块。当数组需要扩容时,程序需要申请一个更大的内存块,将原有元素复制到新的内存块中,这时可以将原有内存块删除,并将指针指向新的内存块。在缩小数组大小时,同样需要按照类似的方式操作。
三、动态数组的优缺点
优点:
1、动态数组可以根据需要实时改变数组大小,可以更好的控制内存的使用。
2、相比于静态数组,动态数组可以减少浪费。
缺点:
1、动态数组需要额外的内存储存指针,由于动态数组的增长通常是指数级别的,因此会产生较大的内存开销。
2、由于动态数组的内存分配不是连续的存储空间,因此数组元素的访问效率不如静态数组高。
四、动态数组实现代码
#include <iostream> using namespace std; class DynamicArray { private: int *pData;//指向动态数组的指针 int m_size;//动态数组的大小 int m_nLength;//动态数组的长度 public: DynamicArray(int size) { m_size = size; m_nLength = 0; pData = new int[m_size]; } ~DynamicArray(void) { delete[] pData; } void ReSize(int newSize) { int *pNewData = new int[newSize]; memcpy(pNewData, pData, sizeof(int) * m_nLength); delete[] pData; pData = pNewData; m_size = newSize; } void Add(int element) { if (m_nLength == m_size) { ReSize(m_size * 2); } pData[m_nLength++] = element; } void RemoveAt(int nIndex) { if (nIndex >= m_nLength || nIndex < 0) { return; } for (int i = nIndex; i < m_nLength - 1; i++) { pData[i] = pData[i + 1]; } m_nLength--; if (m_nLength < m_size / 2) { ReSize(m_size / 2); } } };
五、动态数组的使用示例
我们可以使用上述的动态数组代码进行测试。
int main() { DynamicArray arr(10); arr.Add(1); arr.Add(2); arr.Add(3); arr.Add(4); arr.Add(5); arr.Add(6); arr.RemoveAt(3); for (int i = 0; i < arr.GetSize(); i++) { cout << arr[i] << " "; } return 0; }
六、小结
本文详细介绍了C++动态数组的概念、实现原理、优缺点以及代码实现。动态数组是一个非常实用的数据结构,可以帮助我们更好的控制内存的使用,管理数据。使用动态数组时,需要注意动态数组的内存开销和访问效率。
原创文章,作者:TZJIN,如若转载,请注明出处:https://www.506064.com/n/332278.html