C++ primer 模板与泛型编程

继续浏览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();
	}
}


C++ primer 模板与泛型编程,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。