C++ primer 模板與泛型程式設計

jsjliuyun發表於2014-05-14

繼續瀏覽c++ primer 看到模板與泛型程式設計這章,就順便把這幾節的程式碼綜合了下,對一個Queue佇列模板的實現

貼一下程式碼(看完書,自己敲,忘記了哪再看下書)

#include <ostream>
using std::ostream;

//宣告Queue的模板類
template <class Type> class Queue;
//宣告模板函式
template <class T> ostream& operator<<(ostream& , const Queue<T>&);


//定義QueueItem的模板類
template <class Type> class QueueItem
{
	//定義友元模板類和友元模板函式
	friend class Queue<Type>;
	friend ostream& operator<< <Type>(ostream& , const Queue<Type>&);
	//QueueItem建構函式
	QueueItem(const Type &t):item(t),next(0){}
	QueueItem *next;
	Type item;
};

//定義Queue模板類
template <class Type> class Queue
{
	//定義友元模板函式
	friend ostream& operator<< <Type>(ostream& , const Queue<Type>&);
public:
	//建構函式
	Queue():head(0),tail(0){}
	template <class It> Queue(It beg, It end):head(0),tail(0){copy_elems(beg,end);}
	template <class Iter> void assign(Iter , Iter);
	//複製建構函式
	Queue(const Queue &object){head(0);tail(0);copy_elems(object);}
	//賦值操作符
	Queue& operator=(const Queue&);
	//解構函式
	~Queue(){destroy();}
	//push操作
	void push(const Type&);
	//pop操作
	void pop();
	//取佇列頭元素的操作front
	Type& front();
	//判斷是否為空的操作
	bool empty(){return head==0;}
private:
	QueueItem *head;
	QueueItem *tail;
	void destroy();
	void copy_elems(const Queue&);
	template <class Iter> void copy_elems(Iter , Iter);
};
//過載輸出操作符
template <class T> ostream& operator<<(ostream &os , const Queue<T> &object)
{
	os << "<";
	QueueItem *p;
	for(p=object.head;p!=object.tail;p=p->next)
	{
		os <<p->item << " ";
	}
	os << ">" << endl;
}
//定義Queue模板類中的模板成員函式
template<class Type> template <class Iter> void Queue<Type>::assign(Iter beg, Iter end)
{
	destroy();
	copy_elems(beg , end);
}
//定義Queue模板類中的copy_elems模板成員函式
template <class Type> template <class Iter> void Queue<Type>::copy_elems(Iter beg, Iter end)
{
	while(beg != end)
	{
		push(*beg);
		++beg;
	}
}
//Queue模板類中的copy_elems成員函式
template <class Type> void Queue<Type>::copy_elems(const Queue &object)
{
	QueueItem<Type> *p;
	for(p=object.head;p&&p!=object.tail;p=p->next)
	{
		push(p->item);
	}
}
//賦值操作符
template <class Type> Queue<Type>& Queue<Type>::operator=(const Queue &rhs)
{
	if(&rhs != this)
	{
		destroy();
		copy_elems(rhs);
	}
	return *this;
}
/*
//另外一種用連結串列直接實現賦值操作符
template <class Type> Queue<Type>& Queue<Type>::operator=(const Queue &rhs)
{
	QueueItem<Type> *p = rhs.head;
	while(p)
	{
		QueueItem<Type> *q = new QueueItem<Type>(p->item);
		if(p == rhs.head)
		{
			head = tail = q;
		}else{
			tail->next = q;
			tail = q;
			p=p->next;
		}
	}
	return *this;
}
*/
//push操作
template <class Type> void Queue<Type>::push(const Type &value)
{
	QueueItem<Type> *p = new QueueItem<Type>(value);
	if(this->empty())
	{
		head = p;
		tail = p;
	}else{
		tail->next = p;
		tail = p;
	}
}
//pop操作
template <class Type> void Queue<Type>::pop()
{
	QueueItem<Type> *p;
	p=head;
	head = head->next;
	delete p;
}
//front操作
template <class Type> Type& Queue<Type>::front()
{
	return head->item;
}
//destory操作
template <class Type> void Queue<Type>::destroy()
{
	while(!empty())
	{
		pop();
	}
}


相關文章