1.顺序存储
平均时间复杂度为O(n) 空间复杂度为O(0)
查找,删除,增加的时间复杂度为O(0),修改的时间复杂度为O(1)
优点:存储空间紧凑,容易进行查找
缺点:插入删除需要移动大量元素。需要分配大量空间
2.索引存储
元素个数为M 索引数为N 查找的时间复杂度为O(M/N) 插入删除增加的时间复杂度为O(1)
本质为一个指针数组,数组的每一个元素可以是动态数组,链表,树或者图
#pragma once
template<class T>
class myvector
{
public:
myvector();
~myvector();
void push_back(T t);
T* find(T t);
void show();
void change(T* pos, T t);
void del(T t);
void insert(int pos,T t);
T operator [](int i);
public:
T* p;
int n;
int reallen;
};
#include "myvector.h"
#include <iostream>
using namespace std;
/*
myvector();
~myvector();
void push_back(T t);
T *find(T t);
void show();
void change(T *pos, T t);
void del(T t);
void insert(T *pos,T t);
*/
template<class T>
myvector<T>::myvector()
{
p = nullptr;
n = reallen = 0;
}
template<class T>
myvector<T>::~myvector()
{
if (p != nullptr)
{
delete[]p;
n = reallen = 0;
}
}
//从尾部插入数据
template<class T>
void myvector<T>::push_back(T t)
{
if (p == nullptr)
{
p = new T;
*p = t;
n = reallen = 1;
}
else
{
T* ptemp = new T[n + 1];
for (int i = 0;i < n;i++)
{
ptemp[i] = p[i];
}
delete[]p;
p = ptemp;
p[n] = t;
reallen += 1;
n += 1;
}
}
//查找数据元素返回位置
template<class T>
T* myvector<T>::find(T t)
{
for (int i = 0;i < reallen;i++)
{
if (p[i] == t)
{
return p + i;
}
}
return nullptr;
}
//打印数据元素
template<class T>
void myvector<T>::show()
{
if (p == nullptr)
{
return;
}
for (int i = 0;i < reallen;i++)
{
cout << "p[" << i<<"]="<<p[i] << endl;
}
}
//改变数据元素
template<class T>
void myvector<T>::change(T *pos, T t)
{
if (pos == nullptr)
{
return;
}
else
{
*pos = t;
}
}
//删除数据
template<class T>
void myvector<T>::del(T t)
{
int pos = -1;
for (int i = 0;i < reallen;i++)
{
if (p[i] == t)
{
pos = i;
break;
}
}
if (pos != -1)
{
if (pos == reallen - 1)
{
reallen -= 1;
}
else
{
for (int i = pos;i < reallen - 1;i++)
{
p[i] = p[i + 1];
}
}
}
}
//插入数据
template<class T>
void myvector<T>::insert(int pos, T t)
{
if (pos>0 && pos<= n)
{
//重新分配内存并拷贝
T *ptemp = new T[n + 1];//重新分配内存
for (int i = 0; i < n; i++)
{
*(ptemp + i) = *(p + i);//拷贝
}