编程语言
首页 > 编程语言> > C++ 可变数组实现

C++ 可变数组实现

作者:互联网

话不多说,直接上代码,看注释

template<class T>  // 支持传入泛型,但string这种可变长度的类型还不支持
class Array {
    int mSize = 0, mCapacity;  // 数组元素个数; 数组容量
    T *mPosition;  // 数组首地址
public:
    // 数组初始化,输入参数小于0,默认为5的数组
    explicit Array(int capacity = 5) : mCapacity(capacity) {
        mPosition = new T[mCapacity];  // 在堆区申请内存
    }

    // 析构函数
    ~Array() {
        delete[] mPosition;  // 释放堆区空间
        mPosition = nullptr;
    }

    // 向数组内添加元素
    void add(T value) {
        // 当前元素等于容量
        if (mSize == mCapacity) {
            mCapacity += 5;
            T *newPosition = new T[mCapacity]; // 每次申请5个
            memcpy(newPosition, mPosition, mSize * sizeof(T)); // 把原数组的数据拷贝进新数组
            mPosition = newPosition;  // 指针指向更新
        }
        *(mPosition + mSize) = value;  // 向数组中添加元素
        mSize++;
    }

    // 获取数组内指定索引的元素
    T get(int position) {
        if (position > mSize || position < -(mSize)) throw out_of_range("数组越界");  // 输入参数越界时,抛出异常
        position = position < 0 ? position + mSize : position;  // 支持负索引,最后一个索引为-1
        return *(mPosition + position);
    }

    // 获取当前元素个数
    int size() const {
        return mSize;
    }

    // 重载[]运算符,可以使用索引获取
    T operator[](int position) {
        if (position >= mSize || position < -(mSize)) throw out_of_range("数组越界");  // 输入参数越界时,抛出异常
        position = position < 0 ? position + mSize : position;  // 支持负索引,最后一个索引为-1
        return *(mPosition + position);
    }
};

如有问题,感谢批评指正

标签:mPosition,int,C++,mSize,数组,可变,mCapacity,position
来源: https://www.cnblogs.com/microDeLe/p/15364291.html