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;
}
}