多功能的模板
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;}