实现一个类似vector的动态数组。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Array
{
public:
Array(int size = 10) :mCap(size), mCur(0)
{
mpArr = new int[mCap];
}
~Array()
{
delete [] mpArr;
mpArr = nullptr;
}
public:
// 末尾增加元素 O(1)
void push_back(int val)
{
if (mCur == mCap)
{
expand(2 * mCap); // 扩容 O(n)
}
mpArr[mCur++] = val;
}
// 末尾删除元素 O(1)
void pop_back()
{
if (mCur == 0)
{
return;
}
mCur--; // 没必要将最后的元素清0
}
// 按位置增加元素 O(n)
void insert(int pos, int val)
{
if (pos < 0 || pos > mCur)
{
return;
}
if (mCur == mCap)
{
expand(2 * mCap);
}
// 当在0-mCur之间插入,需要移动元素
// 移动时从最后向前移
for (int i = mCur - 1; i >= pos; i--)
{
mpArr[i + 1] = mpArr[i];
}
mpArr[pos] = val;
mCur++;
}
// 按位置删除
void erase(int pos)
{
if (pos < 0 || pos >= mCur)
{
return;
}
// O(n)
for (int i = pos + 1; i < mCur; i++)
{
mpArr[i - 1] = mpArr[i]; // 每个元素都向前走一个
}
mCur--;
}
// 元素查询(返回下标)
int find(int val)
{
for (int i = 0; i < mCur; i++) // O(n)
{
if (mpArr[i] == val)
{
return i;
}
}
return -1;
}
// 输出
void show() const
{
for (int i = 0; i < mCur; i++)
{
cout << mpArr[i] << " ";
}
cout << endl;
}
// 输出有效个数
int get_mCur()
{
return mCur;
}
private:
int *mpArr; // 指向堆内存(数组)
int mCap; // 记录数组容量
int mCur; // 数组有效元素个数
private:
// 内部数据扩容接口,定义为私有方法
void expand(int size) // 扩容在原来内存上的数据拷贝到新内存上,并释放原来新内存
{
int *p = new int[size]; // 1. 申请内存
memcpy(p, mpArr, sizeof(int) * mCap); //2. 将原来内容复制到新数组中
delete[] mpArr;
mpArr = p;
mCap = size;
}
};
int main()
{
Array arr;
srand(time(0)); // 按时间种随机数种子
for (int i = 0; i < 8; i++)
{
arr.push_back(rand() % 100);
}
arr.show();
// 删除末尾元素
arr.pop_back();
arr.show();
// void erase(int pos)
arr.erase(5);
arr.show();
//
arr.insert(0, 999);
arr.show();
int pos = arr.find(999);
cout << pos << endl;
arr.erase(pos);
arr.show();
system("pause");
return 0;
}