首页 > 代码库 > C++模板应用 -----queue

C++模板应用 -----queue

本篇我们将实现Queue的简单操作;

一、Queue版本1;

通过本程序,我们可以看到 pop、push 、back、front、size的简单操作的实现;

//Queue.hpp#ifndef QUEUE_H_#define QUEUE_H_#include <deque>template <typename T, typename V =std::deque<T>//默认的类型形参 >class Queue{    public:        typedef typename V::size_type size_type;                Queue(){ }         void push(const T &t)        { elems_.push_back(t);  }//调用deque的函数        void pop()        { elems_.pop_front(); }                const T &back()const        { return elems_.back();}        T &back()                { return elems_.back();}        const T &front()const        { return elems_.front();}        T &front()        { return elems_.front();}                size_type size()const        { return elems_.size(); }                bool empty()const        { return elems_.empty(); }    private:        V elems_; ///唯一的数据成员        //我们将类型为T的元素存储于 elemss_(deque)中,调用deque的接口,实现以上各个功能};#endif 

 

main.cpp

 1 #include "Queue.hpp" 2 #include <iostream> 3 #include <string> 4 using namespace std; 5  6 int main(int argc, const char *argv[]) 7 { 8     Queue<string> qu; 9     qu.push("hello");10     qu.push("world");11 12     cout <<qu.size() << endl;13 14     cout << qu.back()<< endl;15     16     while( !qu.empty())17     {18         cout << qu.front()<< endl;19         qu.pop();20     }21    22     return 0;23 }


二、Queue版本2:

上面的程序尽管完成了一些操作,但是若要遇到一些问题,便束手无策了,例如:

现有类型 Queue<int,deque<int> > q1;

1、将 Queue<double, deque<double>> q2 类型的队列 复制或者赋值给 q1;(仅仅 将 int 换为double , deque没有发生变化)

2、又或者 将Queue<double, list<double> >  q3复制或者赋值给 q1;(将 int 换位 double, 将deque默认类型形参 换为  list)

以下程序帮我们实现此类转换:

Stack.hpp

 1 #ifndef QUEUE_H_ 2 #define QUEUE_H_ 3  4 #include <deque> 5  6 template <typename T, typename V =std::deque<T> > 7 class Queue 8 { 9     public:10         typedef typename V::size_type size_type;11         Queue(){}12         //完成两种不同类型的转换,需要重置两个形参13         //如Queue<int>-->Queue<double> || -->Queue<double, list<double> >14         template <typename T2, typename V2>15         Queue<T, V>(const Queue<T2, V2> &other);16         template <typename T2, typename V2>17         Queue<T, V> &operator=(const Queue<T2, V2> &other);18 19         void push(const T &t)20         { elems_.push_back(t);  }21         void pop()22         { elems_.pop_front(); }23         24         const T &back()const25         { return elems_.back();}26         T &back()27         { return elems_.back();}28         const T &front()const29         { return elems_.front();}30         T &front()31         { return elems_.front();}32         33         size_type size()const34         { return elems_.size(); }35         36         bool empty()const37         { return elems_.empty(); }38     private:39         V elems_;40 };41 42 template <typename T, typename V>  //注意要用两个模板声明43 template <typename T2, typename V2>44 Queue<T, V>::Queue(const Queue<T2, V2> &other) //copy构造函数45 {46     Queue<T2, V2> tmp(other); //将 other 拷贝47     while( !tmp.empty())48     {49         push(tmp.front()); //赋值给当前queue<T,V>50         tmp.pop();51     }52 }53 54 template <typename T, typename V>55 template <typename T2, typename V2>56 Queue<T, V> &Queue<T,V>::operator=(const Queue<T2, V2> &other)57 {58     //判断两者是否相等59     if((void*)this == (void*)&other)60         return *this;61     //删除元素62     while( !empty() )63         pop();64     //复制元素   65     Queue<T2, V2> tmp(other);66     while( !tmp.empty())67     {68         push(tmp.front());69         tmp.pop();70     }71 }72 73 #endif 


main.cpp

 1 #include "Queue.hpp" 2 #include <iostream> 3 #include <list> 4 using namespace std; 5  6 int main(int argc, const char *argv[]) 7 { 8     Queue<int> qt; 9     qt.push(62);10     qt.push(23);11     qt.push(9);12     qt.push(56);13     qt.push(31);14     15     cout << qt.size() << endl;16 17     Queue<double> qt2(qt);18     cout << "qt2" << endl;19     while(!qt2.empty())20     {21         cout <<qt2.front() << endl;22         qt2.pop();23     }24     25     Queue<double, list<double> > qt3;26     qt3 = qt;27     cout << "qt3" << endl;28     while(!qt3.empty())29     {30         cout <<qt3.front() << endl;31         qt3.pop();32     }33    34     return 0;

 

C++模板应用 -----queue