1.Vector模闆實作
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;
template<class T>
class Vector
{
public:
Vector()
:_start(NULL)
,_finish(NULL)
,_endofstorage(NULL)
{}
Vector(const Vector<T>& v)
{
if(v.Size()>0)
{
_start=new T[v.Size()];
memcpy(_start,v._start,sizeof(T)*v.Size());
_finish=_start+v.Size();
_endofstorage=_start+v.Capacity();
}
else
{
_start=_finish=_endofstorage=NULL;
}
}
Vector<T>& operator=(const Vector<T>& v)
{
size_t size=v.Size();
delete [] _start;
T* tmp=new T[size];
for(size_t i=0; i<size; ++i)
{
tmp[i]=v._start[i];
}
_start=tmp;
_finish=_start+size;
_endofstorage=_start+v.Capacity();
return *this;
}
~Vector()
{
delete[] _start;
_start=_finish=_endofstorage=NULL;
}
void Insert(size_t pos,const T& x)
{
assert(pos<=Size());
if(_finish==_endofstorage)
{
Expand(Capacity()*2);
}
T* end=_finish;
while(end>=_start+pos)
{
*(end+1)=*end;
--end;
}
_start[pos]=x;
++_finish;
}
void Expand(size_t n)
{
if(Empty())
{
_start=new T[3];
_finish=_start;
_endofstorage=_start+3;
}
else if(n>Capacity())
{
size_t size=Size();
T* tmp=new T[n];
//類型萃取
for(size_t i=0; i<size; ++i)
{
tmp[i]=_start[i];//調用string的指派運算符
}
_start=tmp;
_finish=_start+size;
_endofstorage=_start+n;
}
}
void PushBack(const T& x)
{
Insert(Size(),x);
}
void Erase(size_t pos)
{
assert(pos<Size());
T* cur=_start+pos+1;
while(cur!=_finish)
{
*(cur-1)=*cur;
++cur;
}
--_finish;
}
void PopBack()
{
Erase(Size()-1);
}
void PopFront()
{
Erase(0);
}
bool Empty()
{
return _start==_finish;
}
size_t Capacity()const
{
return _endofstorage-_start;
}
size_t Size()const
{
return _finish-_start;
}
size_t Find(const T& x)
{
size_t size=Size();
for(size_t i=0; i<size; ++i)
{
if(_start[i]=x)
{
return i;
}
}
return -1;
}
void Print()
{
for(size_t i=0; i<Size(); ++i)
{
cout<<_start[i]<<" ";
}
cout<<endl;
}
T& Back()
{
return *(_finish-1);
}
T& Front()
{
return *_start;
}
size_t operator[](size_t index)
{
return _start[index];
}
private:
T* _start;
T* _finish;
T* _endofstorage;
};
void TestVector()
{
Vector<int> v1;
v1.PushBack(1);
v1.PushBack(2);
v1.PushBack(3);
v1.PushBack(4);
Vector<int> v2(v1);
//Vector<int> v2;
//v2=v1;
v1.Print();
v2.Print();
}
2.List模闆實作
#pragma once
#include<iostream>
#include<assert.h>
#include<string>
#include<stddef.h>
using namespace std;
template<class T>
struct ListNode{
ListNode<T>* _next;
ListNode<T>*_prev;
T _data;
ListNode(const T& x)
:_data(x)
,_next(NULL)
,_prev(NULL)
{}
};
template<class T>
class List{
typedef ListNode<T> Node;
public:
List()
:_head(new Node(T()))
{
_head->_next=_head;
_head->_prev=_head;
}
List(const List<T>&l)
{
_head=new Node(T());
_head->_next=_head;
_head->_prev=_head;
Node* cur=l._head->_next;
while(cur!=l._head)
{
PushBack(cur->_data);
cur=cur->_next;
}
}
List<T>& operator=( List<T>& l)
{
swap(l._head,_head);
return *this;
}
~List()
{
Clear();
delete _head;
_head=NULL;
}
void Clear()
{
Node* cur=_head->_next;
while(cur!=_head)
{
Node* next=cur->_next;
delete cur;
cur=next;
}
}
void PushBack(const T& x)
{
Insert(_head,x);
}
void PopBack()
{
Erase(_head->_prev);
}
void PushFront(const T& x)
{
Insert(_head->_next,x);
}
void PopFront()
{
Erase(_head->_next);
}
void Insert(Node* pos,const T& x)
{
assert(pos);
Node* prev=pos->_prev;
Node* new_node=new Node(x);
new_node->_next=pos;
pos->_prev=new_node;
prev->_next=new_node;
new_node->_prev=prev;
}
void Erase(Node* pos)
{
assert(pos);
Node* prev=pos->_prev;
Node* next=pos->_next;
delete pos;
prev->_next=next;
next->_prev=prev;
}
Node* Find(const T& x)
{
Node* cur=_head->_next;
while(cur!=_head)
{
if(cur->_data==x)
{
return cur;
}
cur=cur->_next;
}
return NULL;
}
size_t Size()
{
Node* cur=_head->_next;
size_t count=0;
while(cur!=_head)
{
cur=cur->_next;
++count;
}
return count;
}
void Print()
{
Node* cur=_head->_next;
while(cur!=_head)
{
cout<<cur->_data<<" ";
cur=cur->_next;
}
cout<<endl;
}
void Swap(List<T>& l)
{
swap(_head,l._head);
}
T& Back()
{
return _head->_prev->_data;
}
T& Front()
{
return _head->_next->_data;
}
bool Empty()
{
return _head->_next==_head;
}
protected:
Node* _head;
};
void TestList()
{
List<int> L1;
L1.PushBack(1);
L1.PushBack(2);
L1.PushBack(3);
L1.PushBack(4);
L1.PushBack(5);
//L1.PopBack();
//List<int> L2(L1);
List<int> L2;
L2=L1;
//L2=L1;
/*List<string> L2;
L2.PushBack("hello");
L2.PushBack("world");
L2.PushBack("hello");
L2.PushBack("linux");*/
L1.Print();
L2.Print();
}
3.基于Vector和List實作的Stack(擴充卡)
//擴充卡模式
//模闆的模闆參數
#pragma once
#include "Vector.h"
#include "List.h"
template<class T,class Container>
class stack
{
public:
void Push(const T& x)
{
_con.PushBack(x);
}
void Pop()
{
_con.PopBack();
}
const T& Top()
{
return _con.Back();
}
bool Empty()
{
return _con.Empty();
}
size_t size()
{
return _con.Size();
}
private:
Container _con;
};
void TestStack()
{
//stack<int,Vector<int> > s1;
stack<int,List<int> > s1;
s1.Push(1);
s1.Push(2);
s1.Push(3);
s1.Push(4);
while(!s1.Empty())
{
cout<<s1.Top()<<" ";
s1.Pop();
}
cout<<endl;
}
4.基于Vector和List實作的Queue
#pragma once
#include "List.h"
#include "Vector.h"
template<class T,class container>
//template<class T,template<class>class container>//防止參數類型不一緻
class Queue
{
public:
void Push(const T& x)
{
_con.PushBack(x);
}
void Pop()
{
_con.PopFront();
}
T& Front()
{
return _con.Front();
}
size_t Size()
{
return _con.Size();
}
bool Empty()
{
return _con.Empty();
}
protected:
container _con;
//container<T> _con;
};
void TestQueue()
{
Queue<int,List<int> > q1;
//Queue<int,Vector<int> > q1;
q1.Push(1);
q1.Push(2);
q1.Push(3);
q1.Push(4);
while(!q1.Empty())
{
cout<<q1.Front()<<" ";
q1.Pop();
}
cout<<endl;
}
//main.c
#include "List.h"
#include "Vector.h"
#include "stack.h"
#include "Queue.h"
int main()
{
//TestVector();
//TestList();
TestStack();
//TestQueue();
system("pause");
return 0;
}