原理总结:在空间不足时
1. 开辟一块空间大小是旧空间两倍的新空间。
2.将旧空间的内容拷贝到新空间
3. 释放旧空间
具体实现代码:
#include <iostream>
using namespace std;
template<typename T>
struct Dynamic_Array{
//动态数组头部指针
T* p;
//容量
int capacity;
//实际存储数据个数
int size;
//初始化动态数组
Dynamic_Array();
//析构函数
~Dynamic_Array();
//添加元素
void addItem(T item);
//删除元素
void deleteItem(int index);
//查询元素下标
int queryIndex(T item);
//清空动态数组
void clearArray();
//动态数据概览
void showDynamicArray();
};
template<typename T>
Dynamic_Array<T>::Dynamic_Array()
{
p=new int[10];
capacity=10;
size=0;
}
template<typename T>
Dynamic_Array<T>::~Dynamic_Array()
{
//防止内存泄漏
delete p;
}
template<typename T>
void Dynamic_Array<T>::addItem(T item)
{
if(capacity==size)
{
//开辟新空间
T* tmp=new T[capacity*2];
//将数据拷贝到新空间
memcpy(tmp,p,sizeof(T)*capacity*2);
//释放旧空间
delete [] p;
//更改指向
p=tmp;
//更新容量
capacity=capacity*2;
}
//添加元素
p[size]=item;
//更新大小
size++;
}
template<typename T>
void Dynamic_Array<T>::deleteItem(int index)
{
if(index<0 || index>=size)
{
return;
}
for(int i=index;i<size-1;i++)
{
p[i]=p[i+1];
}
size--;
}
template<typename T>
int Dynamic_Array<T>::queryIndex(T item)
{
for(int i=0;i<size;i++)
{
//若是非基础类型需重载运算符
if(p[i]==item)
{
return i;
}
}
return -1;
}
template<typename T>
void Dynamic_Array<T>::clearArray()
{
size=0;
}
template<typename T>
void Dynamic_Array<T>::showDynamicArray()
{
cout<<"capacity is "<<capacity<<" size is "<<size<<endl;
}
int main()
{
Dynamic_Array<int> arr;
arr.showDynamicArray();
arr.addItem(1);
arr.addItem(2);
arr.addItem(3);
arr.addItem(4);
arr.addItem(5);
arr.addItem(6);
arr.addItem(1);
arr.addItem(2);
arr.addItem(3);
arr.addItem(4);
arr.addItem(5);
arr.addItem(6);
arr.deleteItem(8);
cout<<"query index is "<<arr.queryIndex(4)<<endl;
arr.showDynamicArray();
arr.clearArray();
arr.showDynamicArray();
return 0;
}
运行结果: