microDeLe

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

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);
    }
};

如有问题,感谢批评指正

分类:

c++

技术点:

相关文章:

  • 2021-08-04
  • 2021-11-08
  • 2021-11-09
  • 2020-12-30
  • 2021-07-19
  • 2021-11-29
  • 2021-07-30
  • 2019-08-13
猜你喜欢
  • 2021-06-22
  • 2021-07-22
  • 2021-08-16
  • 2018-07-13
  • 2021-05-11
  • 2021-09-11
  • 2021-12-18
相关资源
相似解决方案