C++ 可变数组实现

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

#include <iostream>
#include <cstring>

using namespace std;

// 可变数组实现
template<class T>
class Array {
    template<class E>
    friend ostream& operator<<(ostream &_cout, Array<E> &array);  // 重载  << 运算符可直接实现打印
    int mSize = 0, mCapacity;  // 数组元素个数; 数组容量
    T *mPosition;  // 数组首地址
    int indexCheck(int position){
        if (position > mSize || position < -(mSize)) throw out_of_range("数组越界");  // 输入参数越界时,抛出异常
        return position < 0 ? position + mSize : position;  // 支持负索引,最后一个索引为-1
    }

    void expandCapacity(){
        mCapacity += 5;
        T *newPosition = new T[mCapacity]; // 每次申请5个
        memcpy(newPosition, mPosition, mSize * sizeof(T)); // 把原数组的数据拷贝进新数组
        mPosition = newPosition;  // 指针指向更新
    }
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) expandCapacity();  // 扩大容量
        *(mPosition + mSize) = value;  // 向数组中添加元素
        mSize++;
    }

    // 获取数组内指定索引的元素
    T get(int position) {
        return *(mPosition + indexCheck(position));
    }

    // 重载[]运算符,可以使用索引获取
    T operator[](int position) {
        return get(position);
    }

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

    // 删除数组类指定位置的元素
    bool remove(int position){
        position = indexCheck(position);
        for (int i = position+1; i < mSize; ++i) {
            *(mPosition+i-1) = *(mPosition+i);  // 所有元素前移
        }
        mSize--;
        return true;  // 删除成功
    }

    bool insert(int position, int value){
        position = indexCheck(position);  // 索引合法性检查
        if (mSize == mCapacity) expandCapacity();  // 如果当前数组已满,扩大容量
        for (int i = mSize; i >= position; --i) {
            *(mPosition+i+1) = *(mPosition+i);
        }
        *(mPosition+position) = value;
        mSize ++;
        return true;
    }
};

//  重载  << 运算符可直接实现打印
template <class T>
ostream &operator<<(ostream &_cout, Array<T> &array){
    cout << "[";
    for (int i = 0; i < array.mSize; ++i) {
        cout << array[i];
        if (i != array.mSize-1) cout << ", ";
    }
    cout << "]";
    return _cout;
}

 

如有问题,感谢批评指正

posted @ 2021-10-03 15:44  MicroDeLe  阅读(852)  评论(0编辑  收藏  举报