首先给出所需要实现的函数接口和类的封装
template<class T>
class Vector
{
public:
Vector();//无参构造函数
Vector(const T* array, size_t size);//有参数构造函数
Vector(const Vector & v);//拷贝构造函数
Vector& operator=(const Vector& s);//赋值运算符重载
~Vector();//析构函数
void PushBack(const T& data);//尾插
void PopBack();//弹出尾部最后一个元素
void Insert(size_t pos, const T& data);//指定位置的插入
void Erase(size_t pos);//指定位置的删除
size_t Size()const;//求元素个数
size_t Capacity()const;//求空间容量
bool Empty()const;//判空
void Resize(size_t newSize, const T& data = T());//更改元素个数
T& operator[](size_t index);
const T& operator[](size_t index)const;
friend ostream& operator<<(ostream &out, Vector<T>& s);
T& Front();//返回第一个元素
const T& Front()const;
T& Back();
const T& Back()const;//返回最后一个元素
void Clear();
private:
void _CheckCapacity();//判满函数
private:
T* _start;//指向起始位置
T* _finish;//指向最后一个元素末尾
T* _endOStorage;//指向开辟空间末尾0
};
接下来给出上面接口的具体的实现,但是其中有
类型萃取,因为需要根据不同的数据类型进行不同的赋值方式,从而提高程序的效率。
下面给出所有的实现代码和我自己的测试代码
struct TrueType
{
static bool IsPODType()
{
return true;
}
};
struct FalseType
{
static bool IsPODType()
{
return false;
}
};
template<class T>
struct TypeTraits
{
typedef FalseType PODtype;
};
template<>
struct TypeTraits<double>
{
typedef TrueType PODtype;
};
template<>
struct TypeTraits<int>
{
typedef TrueType PODtype;
};
template<>
struct TypeTraits<char>
{
typedef TrueType PODtype;
};
//上面是类型萃取部分的代码
template<class T>
class Vector
{
public:
Vector();//无参构造函数
Vector(const T* array, size_t size);//有参数构造函数
Vector(const Vector & v);//拷贝构造函数
Vector& operator=(const Vector& s);//赋值运算符重载
~Vector();//析构函数
void PushBack(const T& data);//尾插
void PopBack();//弹出尾部最后一个元素
void Insert(size_t pos, const T& data);//指定位置的插入
void Erase(size_t pos);//指定位置的删除
size_t Size()const;//求元素个数
size_t Capacity()const;//求空间容量
bool Empty()const;//判空
void Resize(size_t newSize, const T& data = T());//更改元素个数
T& operator[](size_t index);
const T& operator[](size_t index)const;
friend ostream& operator<<(ostream &out, Vector<T>& s);
T& Front();//返回第一个元素
const T& Front()const;
T& Back();
const T& Back()const;//返回最后一个元素
void Clear();
private:
void _CheckCapacity();//判满函数
private:
T* _start;//指向起始位置
T* _finish;//指向最后一个元素末尾
T* _endOStorage;//指向开辟空间末尾0
};
template<class T>
Vector<T>::Vector()
:_start(0)
, _finish(0)
, _endOStorage(0){}
template<class T>
Vector<T>::~Vector()
{
if (_start)
{
delete[] _start;
_start = _finish = _endOStorage = NULL;
}
}
template<class T>
Vector<T>::Vector(const T* array, size_t size)
:_start(new T[size])
, _finish(_start+size)
, _endOStorage(_finish)
{
if (TypeTraits<T>::PODtype::IsPODType())
{
memcpy(_start, array, sizeof(T)*size);
}
else
{
for (size_t i = 0; i < size; ++i)
_start[i] = array[i];
}
}
template<class T>
Vector<T>& Vector<T>::operator=(const Vector& s)
{
if (s._start != _start)
{
_start = new T[s.Capacity()]//新开辟容量
if (TypeTraits<T>::PODtype::IsPODType())
{
memcpy(_start, array, sizeof(T)*size);
}
else
{
for (size_t i = 0; i < size; ++i)
*_start[i] = *s._start[i];
}
delete s._start;
}
return;
}
template<class T>
void Vector<T>::_CheckCapacity()
{
if (_finish == _endOStorage)
{
size_t n = Size();
T *start = new T[Capacity() + 5];//多开辟
if (TypeTraits<T>::PODtype::IsPODType())
{
memcpy(start,_start, sizeof(T)*n);
}
else
{
for (size_t i = 0; i < n; ++i)
start[i] = _start[i];
}
_finish = start + Size();
_endOStorage = start+Capacity()+5;
delete [] _start;
_start = start;
}
return;
}
template<class T>
void Vector<T>::Insert(size_t pos, const T& data)//指定位置插入元素
{
assert(pos <= Size()+1);
_CheckCapacity();//判满
size_t n = Size();
for (size_t i =n; i >=pos; i--)
{
_start[i] = _start[i - 1];
}
_start[pos-1] = data;
_finish++;
}
template<class T>
void Vector<T>::Erase(size_t pos)//指定位置的删除
{
if (!Empty())
{
size_t n = Size();//获得元素个数
for (size_t i = pos-1; i<n-1; i++)//删除位置后面的元素向后移动
{
_start[i] = _start[i+1];
}
_finish--;
}
}
template<class T>
void Vector<T>::PushBack(const T& data)
{
_CheckCapacity();
*_finish++ = data;
}
template<class T>
void Vector<T>::PopBack()
{
if (!Empty())
{
_finish--;
}
return;
}
template<class T>
void Vector<T>::Resize(size_t newSize, const T& data = T())//改变元素个数,新增加的空间所赋值的元素
{
if (newSize<=Size())
{
_finish = _start + newSize;
}
else if (newSize > Size() && newSize < Capacity())
{
for (size_t i = Size(); i < newSize; i++)
{
_start[i] = data;//多出来的元素赋值为data
_finish = _start + newSize;
}
}
else
{
T *start = new T[newSize];
for (size_t i=0; i < Size(); i++)
{
start[i] = _start[i];
}
for (size_t j = Size(); j < newSize; j++)
{
start[j] = data;
}
delete[] _start;
_start = start;
_finish = _start + newSize;
_endOStorage = _start + newSize;
}
}
template<class T>
bool Vector<T>::Empty()const
{
if (_start == _finish)
return true;
else
return false;
}
template<class T>
size_t Vector<T>::Size() const//元素个数
{
return _finish - _start;
}
template<class T>
size_t Vector<T>::Capacity()const
{
return _endOStorage - _start;
}
template<class T>
T& Vector<T>::operator[](size_t index)
{
return _start[index];
}
template<class T>
ostream& operator<<(ostream &out, Vector<T>& s)
{
out << s._start[i];
}
template<class T>
T& Vector<T>::Front()
{
return *_start;
}
template<class T>
const T& Vector<T>::Front()const
{
return *_start;
}
template<class T>
T& Vector<T>::Back()
{
return *(_finish-1);
}
template<class T>
const T& Vector<T>::Back()const
{
return *(_finish-1);
}
template<class T>
void Vector<T>::Clear()//清空元素
{
_finish = _start;
}
void TestVector()
{
int arr[] = { 1, 2, 3, 4, 5 };
Vector<int> s(arr, sizeof(arr) / sizeof(*arr));
cout <<"Back()="<< s.Back() << endl;
cout << "Front()="<<s.Front() << endl;
size_t n1 = s.Size();
for (size_t i = 0; i < n1; i++)
{
cout << s[i] << " ";
}cout << endl;
s.Insert(6, 6);
s.Insert(1, 0);
size_t n = s.Size();
for (size_t i = 0; i < n; i++)
{
cout << s[i] << " ";
}cout << endl;
s.Erase(1);
size_t n2 = s.Size();
for (size_t i = 0; i < n2; i++)
{
cout << s[i] << " ";
}cout << endl;
s.Resize(10, 10);
size_t n3 = s.Size();
for (size_t i = 0; i < n3; i++)
{
cout << s[i] << " ";
}cout << endl;
s.Resize(5, 10);
size_t n4 = s.Size();
for (size_t i = 0; i < n4; i++)
{
cout << s[i] << " ";
}cout << endl;
cout << "Capacity=" << s.Capacity() << endl;
string s1[] = { "aaa", "bbb","ccc","dddd"};
string s3[4];
Vector<string> s2(s1, sizeof(s1) / sizeof(*s1));
size_t n5 = s2.Size();
for (size_t i = 0; i < n5; i++)
{
cout << s2[i] << " ";
}cout << endl;
}
测试结果如下,自己可以根据自己的想法去测试上面的功能