【C++】 可变长数组类的实现

可变长数组类的实现

成员变量:size表示元素的个数,ptr指针指向动态分配的数组

成员函数:拷贝构造函数,析构函数释放空间

重载运算符 '='   用于对象间的赋值

重载运算符“[]” 用以支持根据下标访问数组元素

'push_back函数 用于在数组尾部添加一个元素

length 函数 用于返回数组的长度

程序实现如下:

#include <iostream>
#include <cstring>
using namespace std;

class CArray {
private:
    int size;//数组元素的个数
    int* ptr;//指向动态分配的数组
public:
    CArray(int s = 0);  //s代表数组元素的个数
    CArray(CArray& a);  //拷贝构造函数
    ~CArray();          //析构函数
    void push_back(int v);//用于在数组尾部添加一个元素v
    CArray& operator = (const CArray& a);//用于对象间的赋值
    int length() { return size; }
    //非引用的函数返回值不可以作为左值使用
    int& operator[](int i);//返回值为int 不支持a[i] = 4
};

CArray::CArray(int s) :size(s)
{
    if (s == 0)
        ptr = NULL;
    else
        ptr = new int[s];
}

CArray::CArray(CArray& a)//拷贝构造函数的实现
{
    if (!a.ptr) {
        ptr = NULL;
        size = 0;
        return;
    }
    ptr = new int[a.size];
    memcpy(ptr, a.ptr, sizeof(int) * a.size);
    //a.ptr指向的内容拷贝到ptr 拷贝了sizeof(int) * a.size个字节
    size = a.size;
}

CArray::~CArray()
{
    if (ptr) delete[]ptr;
}

CArray& CArray::operator=(const CArray& a)
{
    if (ptr == a.ptr)       //防止a = a这样的赋值导致出错
        return *this;
    if (a.ptr == NULL) {    //如果a里面的数组是空的
        if (ptr) delete[]ptr;
        ptr = NULL;
        size = 0;
        return *this;
    }
    if (size < a.size) {
        if (ptr)
            delete[] ptr;
        ptr = new int[a.size];
    }
    memcpy(ptr, a.ptr, sizeof(int) * a.size);
    size = a.size;
    return *this;
}

int& CArray::operator[](int i)
{
    return ptr[i];
}

void CArray::push_back(int v)//在数组尾部添加一个元素
{
    if (ptr) {
        int* tmpPtr = new int[size + 1];//重新分配空间
        memcpy(tmpPtr, ptr, sizeof(int) * size);//拷贝原数组内容
        delete[]ptr;
        ptr = tmpPtr;
    }
    else   //数组本来是空的
        ptr = new int[1];
    ptr[size++] = v;//加入新的数组元素
}
int main()
{
    CArray v;
    for (int i = 0; i < 5; i++) {
        v.push_back(i);
    }
    CArray v2, v3;
    v2 = v; 
    for (int i = 0; i < v.length(); i++) {
        cout << v2[i] << " ";//输出0 1 2 3 4
    }
    v2 = v3;//v2空的
    for (int i = 0; i < v2.length(); i++) {
        cout << v2[2] << " ";
    }
    cout << endl;
    v[3] = 100;
    CArray v4(v);
    for (int i = 0; i < v4.length(); i++) {
        cout << v4[i] << " ";//输出0 1 2 100 4
    }
    return 0;
}

 关于push_back()成员函数的实现

每添加入一个元素便重新分配空间, 这是十分低效的做法,比如可以每次开空间的时候开32个, 每次到32个,时再开32个 ,这样就避免了每次都要重新分配空间,提高效率。

标准模板库中的vector的push_back原理:

vector有预存的内存(capacity),如果存入的元素大于了capacity,就重新分配一个比原来capacity大两倍的内存。

 摘自:

程序设计与算法(三)C++面向对象程序设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值