基于模板实现的顺序表
#include <iostream>
using namespace std;
template <typename T>
class ArrayList
{
private:
T* data;
int size = 0;
int capcity;
T sum(int l);
public:
ArrayList();
ArrayList(int capcity);
virtual ~ArrayList();
void inflate();
void insert(T e, int index);
void insertFirst(T e);
void insert(T e);
void sortInsert(T e);
T MyDelete(int index);
T MyDeleteLast();
T MyDeleteFirst();
int get(T e);
T getVal(int index);
T getFirst();
T getLast();
void modify(int index, T e);
virtual int getSize();
int getCapacity();
T sum();
void UnionSet(ArrayList& L, ArrayList& ans);
void InterSet(ArrayList& L, ArrayList& ans);
friend ostream& operator <<(ostream& outPut, ArrayList<T>& al)
{
for (int i = 0; i < al.getSize(); ++i)
{
outPut << al.getVal(i) << " ";
}
outPut << endl;
return outPut;
}
};
template <typename T>
inline ArrayList<T>::ArrayList()
{
data = new T[10];
capcity = 10;
}
template <typename T>
inline ArrayList<T>::ArrayList(int capcity)
{
this->capcity = capcity;
T* temp = new T[capcity];
data = temp;
}
template <typename T>
inline ArrayList<T>::~ArrayList()
{
delete[] data;
}
template <typename T>
inline void ArrayList<T>::inflate()
{
if (size >= capcity)
{
T* temp = new T[capcity * 2];
for (int i = 0; i < size; i++)
{
temp[i] = data[i];
}
data = temp;
capcity *= 2;
}
if (size < 0.25 * capcity)
{
T* temp = new T[capcity * 0.5];
for (int i = 0; i < size; i++)
{
temp[i] = data[i];
}
data = temp;
capcity /= 2;
}
}
template <typename T>
inline void ArrayList<T>::insert(T e, int index)
{
inflate();
int i = size - 1;
for (i; i >= 0 && i >= index; --i)
{
data[i + 1] = data[i];
}
data[index] = e;
size++;
}
template <typename T>
void ArrayList<T>::insertFirst(T e)
{
insert(0, e);
}
template <typename T>
inline void ArrayList<T>::insert(T e)
{
insert(e, size);
}
template <typename T>
void ArrayList<T>::sortInsert(T e)
{
for (int i = size - 1; i >= 0; --i)
{
if (data[i] < e)
{
insert(e, i + 1);
break;
}
}
insert(e, 0);
}
template <typename T>
inline T ArrayList<T>::MyDelete(int index)
{
inflate();
T val = data[index];
for (int i = index; i < size - 1; ++i)
{
data[i] = data[i + 1];
}
size--;
return val;
}
template <typename T>
inline T ArrayList<T>::MyDeleteLast()
{
return MyDelete(size-1);
}
template <typename T>
T ArrayList<T>::MyDeleteFirst()
{
return MyDelete(0);
}
template <typename T>
inline int ArrayList<T>::get(T e)
{
for (int i = 0; i < size; ++i)
{
if (e == data[i])
{
return i;
}
}
return -1;
}
template <typename T>
T ArrayList<T>::getVal(int index)
{
return data[index];
}
template <typename T>
T ArrayList<T>::getFirst()
{
return data[0];
}
template <typename T>
T ArrayList<T>::getLast()
{
return data[size-1];
}
template <typename T>
inline void ArrayList<T>::modify(int index, T e)
{
data[index] = e;
}
template <typename T>
inline int ArrayList<T>::getSize()
{
return size;
}
template <typename T>
inline int ArrayList<T>::getCapacity()
{
return capcity;
}
template <typename T>
T ArrayList<T>::sum()
{
return sum(0);
}
template <typename T>
T ArrayList<T>::sum(int l)
{
if (l == size)
{
return 0;
}
return data[l] + sum(l + 1);
}
template <typename T>
inline void ArrayList<T>::UnionSet(ArrayList& L, ArrayList& ans)
{
for (int i = 0; i < size; i++)
if (ans.get(data[i]) == -1)
ans.insert(data[i]);
for (int i = 0; i < L.getSize(); i++)
if (ans.Search(L.data[i]) == -1)
ans.Append(L.data[i]);
}
template <typename T>
void ArrayList<T>::InterSet(ArrayList& L, ArrayList& ans)
{
for (int i = 0; i < size; i++)
if (L.Search(data[i]) != -1)
ans.Append(data[i]);
}