提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、动态数组
1.动态数组介绍
在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
1.具体思路
我们可以在堆区申请一块数组内存空间,当我们申请的内存不够用的时候,可以在堆区再开辟一块新的数组,将旧数组的元素放到新数组中,释放旧数组,最后再插入新元素。
二、程序
1.代码
#include <iostream>
#include "./dynamic_array.h"
using namespace std;
class DynamicArray
{
private:
int m_capacity_; //容量
int m_size_; //长度
int *m_data_;
public:
DynamicArray(int input_capacity);
~DynamicArray();
void insert(int index, int value);
void expand(void);
void remove_index(int index);
void remove_value(int value);
void print(void);
int get_size(void);
int get_capacity(void);
};
//构造
DynamicArray::DynamicArray(int input_capacity)
{
m_capacity_ = input_capacity;
m_size_ = 0;
m_data_ = new int[m_capacity_];
}
//析构
DynamicArray::~DynamicArray()
{
delete[] m_data_;
m_data_ = NULL;
}
//插入元素
void DynamicArray::insert(int index, int value)
{
if (index < 0 || index > m_size_)
{
return;
}
if (m_size_ >= m_capacity_)
{
expand();
}
for (int i = m_size_; i > index; i--) //后移元素
{
m_data_[i] = m_data_[i - 1];
}
m_data_[index] = value;
m_size_++;
return;
}
//扩展数组
void DynamicArray::expand(void)
{
int *old_data = m_data_;
//容量*2后,开辟新空间
m_capacity_ *= 2;
m_data_ = new int[m_capacity_];
for (int i = 0; i < m_size_; i++)
{
m_data_[i] = old_data[i];
}
delete[] old_data;
old_data = NULL;
}
//删除元素
void DynamicArray::remove_index(int index)
{
if (index < 0 || index >= m_size_)
{
return;
}
for (int i = index + 1; i < m_capacity_; i++)
{
m_data_[i - 1] = m_data_[i];
}
m_size_--;
}
//按值删除元素
void DynamicArray::remove_value(int value)
{
for (int i = 0; i < m_capacity_; i++)
{
if (value == m_data_[i])
{
for (int j = i + 1; j < m_capacity_; j++)
{
m_data_[j - 1] = m_data_[j];
}
m_size_--;
return;
}
}
}
//打印数据
void DynamicArray::print(void)
{
for (int i = 0; i < m_size_; i++)
{
if (i > 0)
{
cout << " ";
}
cout << m_data_[i];
}
cout << endl;
}
//返回长度
int DynamicArray::get_size(void)
{
return m_size_;
}
//返回容量
int DynamicArray::get_capacity(void)
{
return m_capacity_;
}
int main(int argc, char const *argv[])
{
DynamicArray arr(10);
arr.insert(0, 1);
arr.insert(8, 2);
arr.insert(0, 5);
arr.insert(0, 7);
arr.insert(0, 4);
cout << "删除前长度:" << arr.get_size() << endl;
arr.print();
arr.remove_index(0);
arr.remove_value(5);
cout << "删除后长度:" << arr.get_size() << endl;
arr.print();
return 0;
}
1.运行结果
删除前长度:4
4 7 5 1
删除后长度:2
7 1