我准备练习一下模板的知识,然后自己实现vector类。在这之前,先用模板实现一个队列来热身吧。队列的底层是链表。主要是熟悉一下模板的写法。
另外,就是模板的定义和实现都要写在一个文件中(export关键字可以避免这样。还没用过),所以倒数第二行我加了个# include "queue.hpp",只能是hpp,不能是cpp。不然报错。我用的是4.5.2。
1.queue.h
/*
* queue.h
*
* Created on: 2011-8-28
* Author: gauss
*/
#ifndef QUEUE_H_
#define QUEUE_H_
template<typename T> class queue;
template<typename T>
class queue_item {
friend class queue<T> ; //注意此处友元类的声明形式
queue_item(const T& i) :
item(i), next(0) {
}
T item;
queue_item *next;
};
template<typename T>
class queue {
public:
queue() :
head(0), tail(0), n(0) {
}
queue(const queue &q);
queue& operator=(const queue &q);
~queue();
void push(const T &i);
void pop();
T front();
T back();
bool empty() {
if (n > 0)
return false;
else
return true;
}
size_t size() {
return n;
}
void clear();
private:
queue_item<T> *head;
queue_item<T> *tail;
size_t n;
void copy_item(const queue &q);
};
#include "queue.hpp" //注意这句话。
#endif /* QUEUE_H_ */
2.queue.hpp
/*
* queue.hpp
*
* Created on: 2011-8-28
* Author: gauss
*/
#ifndef QUEUE_HPP_
#define QUEUE_HPP_
template<typename T>
void queue<T>::push(const T &i) //注意类作用域的形式:queue<T>::
{
queue_item<T> *item = new queue_item<T> (i);
if (n == 0) {
head = tail = item;
} else {
tail->next = item;
tail = item;
}
++n;
}
template<typename T>
void queue<T>::pop() {
if (n > 0) {
queue_item<T> *temp = head;
head = head->next;
delete temp;
--n;
}
}
template<typename T>
T queue<T>::front() { //这里的返回显然可以是T&
if (n > 0) {
return head->item;
} else { //这里处理的不太好,返回了一个默认初始化的T,实现不知道返回什么好
T t;
return t;
}
}
template<typename T>
T queue<T>::back() { //这里的返回显然可以是T&
if (n > 0) {
return tail->item;
} else { //这里我处理的不太好,反回了一个默认初始化的T,实现不知道返回什么好
T t;
return t;
}
}
template<typename T>
void queue<T>::clear() {
while (n > 0) {
pop();
}
}
template<typename T>
queue<T>::~queue() {
clear();
}
template<typename T>
queue<T>::queue(const queue &q) :
head(0), tail(0), n(0) {
copy_item(q);
}
template<typename T>
queue<T>& queue<T>::operator=(const queue &q)
//注意此处,函数返回类型需此种形式queue<T>&, 不能是queue&
{
if (this != &q) {
clear();
n = 0;
copy_item(q);
}
return *this;
}
template<typename T>
void queue<T>::copy_item(const queue &q) {
queue_item<T> *temp = q.head;
while (temp) {
push(temp->item);
temp = temp->next;
}
}
#endif /* QUEUE_HPP_ */
3.main.cpp
#include <cstdlib>
#include <iostream>
#include "queue.h"
#include <string>
using namespace std;
// test the queue class template
int main(int argc, char *argv[]) {
queue<int> q;
if (q.empty())
cout << "empty" << endl;
else
cout << "not empty" << endl;
q.push(1);
q.push(2);
queue<int> q2(q);
q.clear();
if (q.empty())
cout << "empty" << endl;
else
cout << "not empty" << endl;
cout << "queue 2: " << q2.front() << endl;
cout << "queue 2: " << q2.back() << endl;
cout << "the size of queue 2: " << q2.size() << endl;
q = q2;
cout << "queue 1: " << q.front() << endl;
cout << "queue 1: " << q.back() << endl;
queue<string> qs;
qs.push("gauss");
qs.push("randy");
qs.push("jiawenjie");
cout << qs.front() << endl;
cout << qs.back() << endl;
return EXIT_SUCCESS;
}
运行结果:
empty
empty
queue 2: 1
queue 2: 2
the size of queue 2: 2
queue 1: 1
queue 1: 2
gauss
jiawenjie