本例是c++ primer中模板那章的一个例题。自己实现的Queue。主要是讲解了模板的基础用法。
下面是代码,注释还行。
#include <iostream>
#include <vector>
using namespace std;
template <typename T> class Queue;
template <typename T> ostream& operator<<(ostream &os, const Queue<T> &que);
template <typename T>
class QueueItem {
//私有类
friend class Queue<T>;//Queue和QeueItem之间一一对应
friend ostream& operator<< <T> (ostream &os, const Queue<T> &que);
QueueItem(const T &t):item(t), next(0) {}
T item;
QueueItem* next;
};
template <typename T>
class Queue {
friend ostream& operator<< <T> (ostream &os, const Queue<T> &que);
public:
Queue():head(0), tail(0) {}
T front() {return head->item;}
const T& front() const {return head->item;}
//成员模板.用vector初始化Queue
template <typename U>
Queue(U beg, U end);
//assign函数的实现
template <typename U>
void assign(U beg, U end);
//拷贝构造函数(深拷贝,浅拷贝)
Queue(const Queue& que):head(0), tail(0) {
copy_item(que);
}
//重载赋值操作符
Queue<T>& operator=(const Queue<T>&);
bool empty() {
return head == 0;
}
void pop();
void push(const T &t);
~Queue() {destroy();}
private:
QueueItem<T>* head;
QueueItem<T>* tail;
//
inline void copy_item(const Queue& que);
inline void destroy() {
//释放每一个节点
while(!empty()) pop();
//head = tail = 0;
}
template <typename U>
inline void copy(U beg, U end) {
while(beg != end) {
push(*beg);
++beg;
}
}
};
template <typename T> void Queue<T>::pop() {
QueueItem<T> *p = head->next;
delete head;
head = p;
}
template <typename T> void Queue<T>::push(const T &t) {
QueueItem<T> *q = new QueueItem<T>(t);
//考虑队列是否为空
if(empty()) head = tail = q;
else {
tail->next = q;
tail = q;
}
}
template <typename T> inline void Queue<T>::copy_item(const Queue &que) {
QueueItem<T> *p;
for(p=que.head; p; p=p->next) {
push(p->item);
}
}
template <typename T> ostream& operator<<(ostream &os, const Queue<T> &que) {
QueueItem<T> *p;
os << "< ";
for(p=que.head; p; p=p->next) os << p->item << " ";
os << ">" << endl;
return os;
}
template <typename T> istream& operator>>(istream &is, Queue<T> que) {
T x;
while(is >> x) que.push(x);
return is;
}
//定义成员模板。如用vector初始化Queue
template <typename T> template <typename U>
Queue<T>::Queue(U beg, U end):head(0), tail(0) {
copy(beg, end);
}
//assign函数的实现
template <typename T> template <typename U>
void Queue<T>::assign(U beg, U end) {
destroy();
copy(beg, end);
}
int main()
{
short A[4] = {1, 4, 2, 3};
//cout << "ok" << endl;
Queue<int> qi(A, A+4);
//cout << "ok" << endl;
cout << qi;
vector<int> vi(A, A+3);
qi.assign(vi.begin(), vi.end());
cout << qi;
return 0;
}
总结:此程序主要讲解了模板的比较基础的语法。方便以后回过头来复习。