C++模板Queue
最后更新于:2022-04-01 19:55:04
《C++ primer》中的一个例子,感觉对模板编程很有帮助,便从头到尾实现了一遍。内部机制实际上是一个链表,但对外呈现队列的特性。代码如下:
~~~
#ifndef __MYQUEUE_H__
#define __MYQUEUE_H__
#include
// 这里必须提前声明
template
class Queue;
template
std::ostream& operator << (std::ostream &, const Queue &);
template
class QueueItem {
// 声明友元关系
friend class Queue;
friend std::ostream& operator << (std::ostream &, const Queue &);
QueueItem(const Type &t) : item(t), next(NULL)
{}
Type item;
QueueItem *next;
};
template
class Queue {
public:
// 声明友元关系
friend std::ostream& operator << (std::ostream &, const Queue &);
Queue() : head(NULL), tail(NULL)
{}
Queue(const Queue &q) : head(NULL), tail(NULL)
{
copy_elems(q);
}
Queue& operator= (const Queue &);
~Queue()
{
destroy();
}
Type& front()
{
if (head == NULL)
throw exception("Queue is empty.");
return head->item;
}
const Type& front() const
{
if (head == NULL)
throw exception("Queue is empty.");
return head->item;
}
void push(const Type&);
void pop();
bool empty() const
{
return head == NULL;
}
private:
QueueItem *head; // 指向Queue头节点
QueueItem *tail; // 指向Queue尾节点
void copy_elems(const Queue &);
void destroy();
};
template
Queue& Queue::operator= (const Queue &q)
{
if (&q == this)
return *this;
destroy();
copy_elems(q);
return *this;
}
// 从尾添加一个节点
template
void Queue::push(const Type &t)
{
QueueItem *tmp = new QueueItem(t);
if (empty())
{
head = tail = tmp;
}
else
{
tail->next = tmp;
tail = tmp;
}
}
// 从头删除一个节点
template
void Queue::pop()
{
if (head != NULL)
{
QueueItem *tmp = head;
head = tmp->next;
delete tmp;
}
}
template
void Queue::destroy()
{
while (!empty())
pop();
}
template
void Queue::copy_elems(const Queue &q)
{
QueueItem *tmp = q.head;
while (tmp != NULL)
{
push(tmp->item);
tmp = tmp->next;
}
}
template
std::ostream& operator << (std::ostream &os, const Queue &q)
{
QueueItem *tmp = q.head;
while (tmp != NULL)
{
os << tmp->item << ' ';
tmp = tmp->next;
}
return os;
}
// Queue的特化版本
template <>
class Queue {
public:
// 声明特化版本的 operator<< 为友元
friend std::ostream& operator <<
(std::ostream &os, const Queue &q);
void push(const char *);
void pop()
{
real_queue.pop();
}
bool empty() const
{
return real_queue.empty();
}
std::string& front()
{
return real_queue.front();
}
const std::string& front() const // 基于const的成员函数重载
{
return real_queue.front();
}
private:
Queue real_queue;
};
void Queue::push(const char *val)
{
real_queue.push(val);
}
template <>
std::ostream& operator << (std::ostream &os, const Queue &q)
{
os << q.real_queue;
return os;
}
#endif
~~~
参考:
《C++ primer》
';