首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。