您的位置:首页 > 编程语言 > C语言/C++

C++ 可变数组实现

2021-10-03 15:44 483 查看

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

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

 

如有问题,感谢批评指正

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: