C语言动态数组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、动态数组

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值