用模板实现 seqlist
2016-03-22 15:50
267 查看
多功能的模板1 为什么要用模板
在使用之前我们可以探究一下为什么要用模板。首先,模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。
例如:
模板函数
假设现在要实现一个比较两个数是否相等的重载函数。
2 怎么用模板实现seqlist
在使用之前我们可以探究一下为什么要用模板。首先,模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。
例如:
模板函数
假设现在要实现一个比较两个数是否相等的重载函数。
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<<IsEqual (s1, s2)<<endl; cout<<IsEqual (1,1)<<endl; }【注】如果还要比较int/char等等类型就都要分别实现一下,相似的代码重复度非常高。
2 怎么用模板实现seqlist
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> #pragma warning(disable:4018) using namespace std; typedef int DataType; template <typename T> 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<<endl; } private: T* _data; int _size; int _capacity; }; template <typename T> void seqlist<T>:: PushBack(const T& d) { CheckCapacity(); _data[_size] = d; _size++; } template <typename T> void seqlist<T>:: PopBack() { if(_data == NULL) { return; } _size--; _capacity--; } template <typename T> void seqlist<T>:: PushFront(const T& d) { CheckCapacity(); for(i=_size;i>0;i--) { _data[i] = _data[i-1]; } _data[0] = d; ++_size; } template <typename T> void seqlist<T>::PopFront() { int i=0; for(i=0;i<_size;i++) { _data[i-1] = _data[i]; } --_size; } template<typename T> void seqlist<T>::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<typename T> void seqlist<T>::Erase(size_t pos) { int i = 0; for(i=pos;i<_size-1;i++) { _data[i] = _data[i+1] } --_size; } template<typename T> int seqlist<T>::Find(const T& x) { int i=0; for(i=0;i<_szie;i++) { if(_data[i]==x) return i; } return -1; } void Test1() { seqlist<int> s1; s1.PushBack(1); s1.PushBack(2); s1.PushBack(3); s1.PushBack(4); } void Test2() { seqlist<int> s1; s1.PopBack(); } void Test3() { seqlist<int> s1; s1.PopFront(); } void Test3() { seqlist<int> s1; s1.PushFront(1); s1.PushFront(2); s1.PushFront(3); s1.PushFront(4); } template <typename T> int main() { Test1(); s1.Print(); return 0; }
相关文章推荐
- 设计模式之行为型模式 - 调用行为的传递问题
- [div+css]晒晒最新制作专题推广页模板
- 2008大学生入党申请书 模板
- IMAIL多语言模板两套Outlook&Gmail模板下载
- 在PHP中使用模板的方法
- 深入解析php模板技术原理【一】
- Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
- 在ASP中不用模板生成HTML静态页直接生成.html页面
- C#模板方法模式(Template Method Pattern)实例教程
- javascript文本模板用法实例
- 关于Asp代码与页面的分离模板技术第1/3页
- php模板原理讲解
- 需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
- DataGrid 动态添加模板列 实现代码
- 详解java模板和回调机制
- C++模板之特化与偏特化详解
- vs.net2008添加模板方法
- ThinkPHP模板判断输出Empty标签用法详解
- ThinkPHP模板范围判断输出In标签与Range标签用法详解
- thinkphp模板用法和内容输出实例