一、封装顺序表的引出
基础的数据结构有:顺序表、链表、栈、队列。
这些数据结构我们都需要用到 ,但是在C语言中没有这样的库去供我们使用。但是C++中是有这样的库,也就是STL标准模板库中有一个组件是容器组件,容器组件中有一个顺序容器中的vector<int>
就是来封装顺序表的。
由于数组是定长的,所以在封装顺序表的时候我们用到了扩容机制:
1、以倍数的形式开辟更大的空间
2、旧数据拷贝到新的空间中
3、旧空间释放
4、指针指向新空间
二、代码实现封装顺序表
template<typename T>
class Vector
{
public:
Vector(int size = 2)
{
parr = new T[size]();
cursize = 0;
totalsize = size;
}
~Vector
{
delete[] parr;
parr = NULL;
}
template<typname U>
friend class Vector;
//普通化的版本和特例化的版本构成了模板的重载
//拷贝构造函数
template<typname E>
Vector(const Vector<E>& rhs)
{
parr = new T[rhs.totalsize]();
for(int i = 0; i < totalsize; i++)
{
parr[i] = rhs.parr[i];
}
cursize = rhs.cursize;
totalsize = rhs.totalsize;
}
Vector(const Vector<T>& rhs)
{
parr = new T[rhs.totalsize]();
memcpy(parr, rhs.parr, sizeof(T)*totalsize);
cursize = rhs.cursize;
totalsize = rhs.totalsize;
}
void resize()
{
T* tmp = new T[totalsize * 2]();
memcpy(tmp, parr, sizeof(T)*totalsize);
delete[] parr;
parr = tmp;
totalsize *= 2;
}
void push_back(T val)
{
if(full())
{
resize();
}
parr[cursize++] = val;
}
void insert(int pos, T val)
{
if(pos < 0 || pos > cursize)
{
return;
}
if(full())
{
resize();
}
for(int i = cursize; i > pos; i--)
{
parr[i] = parr[i - 1];
}
parr[pos] = val;
cursize++;
}
void pop_back()
{
erase(cursize - 1);
}
void erase(int pos)
{
if(pos < 0 || pos >= cursize)
{
return ;
}
for(int i = pos; i < cursize; i++)
{
parr[i] = parr[i + 1];
}
cursize--;
}
bool empty()
{
return cursize == 0;
}
void show()
{
for(int i = 0; i < cursize; i++)
{
std::cout << parr[i] << " ";
}
std::cout << std::endl;
}
private:
bool full()
{
return cursize == totalsize;
}
T* parr;
int cursize;//当前有效元素的个数
int totalsize;//当前的元素总容量
}