自动扩容
- List item
扩容基数为2
可以设置扩容因子(这里我没有设置)
代码实现如下:
//
// Created by shaoxinHe on 2024/6/4.
//
#ifndef CPRIMER_MYLIST_H
#define CPRIMER_MYLIST_H
#include <stdexcept>
#include <vector>
namespace std {
class myList {
private:
int *arr;
int arrCapacity = 10; // 初始化大小为10
int arrSize = 0; // 当前列表数量
int extendRation = 2; // 扩容数量
public:
myList() {
arr = new int[arrCapacity];
}
/*
* 析构删除数组元素
* */
~myList() {
delete[]arr;
}
/*
* 获取当前元素数量
* */
int getSize() {
return this->arrSize + 1;
}
/*
* 获取列表容量
* */
int getCapacity() {
return this->arrCapacity;
}
/*
* 列表尾添加元素
* */
void add(int num) {
if (arrSize == arrCapacity - 1) {
extendArr();
}
arr[arrSize++] = num;
}
/*
* 在index位置插入元素num
* */
void insert(int num, int index) {
if (index >= arrSize || index < 0) throw out_of_range("数组越界");
if (arrSize + 1 == arrCapacity) extendArr();
for (int i = arrSize; i > (index - 1); i--) {
arr[i + 1] = arr[i];
}
arr[index - 1] = num;
this->arrSize++;
}
/*
* 更新元素
* */
void set(int index, int num) {
if (index < 0 || index >= this->arrSize) throw out_of_range("数组越界");
arr[index] = num;
}
/*
* 获取指定位置的元素
* */
int getIndex(int index) {
if (index < 0 || index >= arrSize) throw out_of_range("数组越界");
else return arr[index - 1];
}
/*
* 删除元素
* */
void remove(int index) {
if (index < 0 || index >= arrSize) throw out_of_range("数组越界");
for (int i = index; i < this->arrSize; i++) {
arr[i] = arr[i + 1];
}
arrSize--;
}
void extendArr() { // 扩容列表
int *temp = arr;
this->arrCapacity *= this->extendRation;
int *newArr = new int[this->arrCapacity];
for (int i = 0; i <= arrSize; i++) {
newArr[i] = temp[i];
}
delete[]temp; // 释放空间
this->arr = newArr;
}
/*
* 列表转换为Vector打印元素
* */
vector<int> toVector() {
vector<int> vec(arrSize);
for (int i = 0; i < arrSize; i++)
vec[i] = arr[i];
return vec;
}
};
} // std
#endif //CPRIMER_LIST_H