多功能的模板


1 为什么要用模板

    在使用之前我们可以探究一下为什么要用模板。首先,模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。

例如:

  • 模板函数

假设现在要实现一个比较两个数是否相等的重载函数。

bool IsEqual (int left, int right){     return left == right;}bool IsEqual (const string& left , const string& right){     return left == right;}void test1 (){     string s1 ("s1"), s2("s2");     cout<
<
<
<

【注】如果还要比较int/char等等类型就都要分别实现一下,相似的代码重复度非常高。

2 怎么用模板实现seqlist

#define _CRT_SECURE_NO_WARNINGS 1#include
#include
#pragma warning(disable:4018)using namespace std;typedef int DataType;template 
class seqlist{public:    seqlist()        :_data(NULL)        ,_size(0)        ,_capacity(0){    CheckCapacity();}        /*seqlist(const T& d)        :_data(d._data)        ,_size(d._size)        ,_capacity (d._capacity)    {}    }*/    ~seqlist()    {        if(_data!=NULL)        delete [] _data;    }public:    void CheckCapacity()    {        if(_size == _capacity)        {            T* tmp=new T[2*_capacity+3];            memcpy(tmp,_data,_size*_sizeof(T));            delete _data;            _data = tmp;            _capacity =2*_capacity+3 ;        }        }public:    void PushBack(const T& d);    void PopBack();    void PushFront(const T& d);    void PopFront();    void Insert(size_t pos, const T& x);    void Erase(size_t pos);    int Find(const T& x);    void PrintSeqList();    void Print()    {        int i=0;        for(i=0;i<_size;i++)        {            cout<<_data[i]<<" "        }        cout<
void seqlist
:: PushBack(const T& d){    CheckCapacity();    _data[_size] = d;    _size++;}template 
void seqlist
:: PopBack(){    if(_data == NULL)    {        return;    }    _size--;    _capacity--;}template 
void seqlist
:: PushFront(const T& d){    CheckCapacity();    for(i=_size;i>0;i--)    {        _data[i] = _data[i-1];    }    _data[0] = d;    ++_size;}template 
void seqlist
::PopFront(){    int i=0;    for(i=0;i<_size;i++)    {        _data[i-1] = _data[i];    }    --_size;}template
void seqlist
::Insert(size_t pos, const T& x){    CheckCapacity();    int i=0;    for(i=_size;i>pos,--i)    {        _data[i] = _data[i-1];    }    _data[i]=d;    ++_size;}template
void seqlist
::Erase(size_t pos){    int i = 0;    for(i=pos;i<_size-1;i++)    {        _data[i] = _data[i+1]    }    --_size;}template
int seqlist
::Find(const T& x){    int i=0;    for(i=0;i<_szie;i++)    {        if(_data[i]==x)            return i;    }    return -1;}void Test1(){    seqlist
 s1;    s1.PushBack(1);    s1.PushBack(2);    s1.PushBack(3);    s1.PushBack(4);}void Test2(){    seqlist
 s1;    s1.PopBack();}void Test3(){    seqlist
 s1;    s1.PopFront();}void Test3(){    seqlist
 s1;    s1.PushFront(1);    s1.PushFront(2);    s1.PushFront(3);    s1.PushFront(4);}template 
int main(){    Test1();    s1.Print();    return 0;}