标签:style blog color io os ar 数据 sp div
本篇我们将实现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()const 25 { return elems_.back();} 26 T &back() 27 { return elems_.back();} 28 const T &front()const 29 { return elems_.front();} 30 T &front() 31 { return elems_.front();} 32 33 size_type size()const 34 { return elems_.size(); } 35 36 bool empty()const 37 { 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;
标签:style blog color io os ar 数据 sp div
原文地址:http://www.cnblogs.com/xfxu/p/4003768.html