C++模板类

Queue.h


 

template <class Type> class Queue;

 

template <class Type> 

std::ostream& operator<<(std::ostream &os, const Queue<Type> &q)

{

         os << "< ";

         QueueItem<Type> *p;

         for (p = q.head; p; p = p->next)

                   os << p->item << " ";

         os << ">";

         return os;

}

 

template <class Type> 

class QueueItem

{

         friend class Queue<Type>;

         friend std::ostream& operator<< <Type> (std::ostream&, const Queue<Type>&);

 

         QueueItem(const Type &t): item(t), next(0) {}

         Type item;

         QueueItem *next;

};

 

template <class Type>

class Queue

{

         friend std::ostream& operator<< <Type> (std::ostream&, const Queue<Type>&);

public:

         Queue(): head(0), tail(0) {}

 

         template <class Iter>

         Queue(Iter beg, Iter end): head(0), tail(0)

         {

                   copy_elems(beg,end);

         }

 

         Queue(const Queue &Q): head(0), tail(0)

         {

                   copy_elems(Q);

         }

 

         ~Queue()

         {

                   destroy();

         }

 

         template <class Iter> void assign(Iter, Iter);

 

         Type& front()

         {

                   return head->item;

         }

 

         const Type &front() const

         {

                   return head->item;

         }

 

         void push(const Type&);

 

         void pop();

 

         bool empty() const

         {

                   return head == 0;

         }

 

private:

         QueueItem<Type> *head;

         QueueItem<Type> *tail;

         void destroy();

         void copy_elems(const Queue&);

 

         template <class Iter> void copy_elems(Iter, Iter);

};

 

 Queue.cpp


 

#include "Queue.h"

 

template <class Type>

template <class Iter> void Queue<Type>::assign(Iter beg, Iter end)

{

         destroy();

         copy_elems(beg, end);

}

 

template <class Type> 

void Queue<Type>::push(const Type &val)

{

         QueueItem<Type> *pt = new QueueItem<Type>(val);

         if (empty())

                   head = tail = pt;

         else

         {

                   tail->next = pt;

                   tail = pt;

         }

}

 

template <class Type>

void Queue<Type>::pop()

{

         QueueItem<Type> *p = head;

         head = head->next;

         delete p;

}

 

template <class Type>

void Queue<Type>::destroy()

{

         while (!empty())

                   pop();

}

 

template <class Type>

void Queue<Type>::copy_elems(const Queue &orig)

{

         for (QueueItem<Type> *pt = orig.head; pt; pt = pt->next)

                   push(pt->item);

}

 

template <class Type> template <class Iter>

void Queue<Type>::copy_elems(Iter beg, Iter end)

{

         while (beg != end)

         {

                   push(*beg);

                   ++beg;

         }

}

posted @ 2013-07-11 23:14  iak  阅读(188)  评论(0编辑  收藏  举报