由上一篇的文章中 ,我们已经知道,模板是一个代码生成器,可以极大效率提高我们的工作效率,实现让编译器为我们产生代码的机制
在C++面向对象中,我们在对类的使用上,已经达到了最少80%了,因此,模板类的使用,将极大的提高程序的运行效率,节省程序的运行时间。
(一)概念区分
类模板:也称类属类或类生产类,允许用户为类定义一种模式,使得类中的某些数据成员,默写成员函数的参数,某些成员参数的返回值,能够取任意类型(包括系统预定义和用户自定义),如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数返回值的类型不能确定,就必须将此类声明为模板,他的存在不是代表一个具体的,实际的类,而是代表一类类。
类模板由三种类型的模板参数:类型模板参数,非类型模板参数和模板的模板参数。
模板类:是类模板实例化的的一个产物,可以从类模板派生出新的类,既可以派生类模板,也可以派生非类模板,模板类的重点是类表示由一个模板生成而来的类,模板类与平台无关,具有可移植性,可用于基本数据类型,可用来创建动态增长和减小的数据结构。
模板类的实例化:只要有一种不同的类型,编译器就会实例化出一个对应的类。
(二)有关Vector模板的实现
Vector:是用来连续的存储数据的,类似于顺序表,在其中任意位置的插入或者删除的效率比较低,但是对内存碎片存在的就比较少,在某些情况下,对内存的使用率比较好。
#define _CRT_SECURE_NO_WARNINGS 1
//注:memcpy会出现浅拷贝的问题,因此在拷贝元素时,应该慎用
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
template<typename T>
class Vector
{
public:
Vector()//构造函数,顺序表为空
:_start(0)
, _finish(0)
, _endOfStorage(0)
{}
Vector(const T*arr, size_t size);//声明,顺序表中已经存放元素
Vector(const Vector& t) //拷贝构造函数
{
size_t size = t.Size();
_start = new T[size];
for (size_t i = 0; i < size; ++i)
{
_start[i] = t._start[i];
}
_finish = _start + size;
_endOfStorage = _finish;
}
Vector<T>&operator=(const Vector<T>&v)//赋值运算符的重载
{
if (this != &v)
{
size_t size = v.Size();
_start = new T[size];
for (size_t i = 0; i < size; ++i)
{
_start[i] = v._sta