代码如下:
1 #ifndef QUEUE_H 2 #define QUEUE_H 3 #include "Exception.h" 4 #include <deque> 5 6 class EmptyQueueException : public Exception 7 { 8 public: 9 EmptyQueueException() 10 :Exception("read empty queue") 11 { } 12 }; 13 14 template <typename T, typename Container = std::deque<T> > 15 class Queue 16 { 17 public: 18 19 typedef T value_type; 20 typedef T& reference; 21 typedef const T& const_reference; 22 typedef Container container_type; 23 typedef Container& container_reference; 24 typedef const Container& const_container_reference; 25 typedef EmptyQueueException exception_type; 26 typedef typename Container::size_type size_type; 27 28 29 explicit Queue(const_container_reference cont = container_type()) 30 :_cont(cont) 31 { } 32 33 template <typename T2, typename Container2> 34 Queue<T, Container>(const Queue<T2, Container2> &s); 35 36 template <typename T2, typename Container2> 37 Queue<T, Container> &operator=(const Queue<T2, Container2> &s); 38 39 void push(const value_type &val) { _cont.push_back(val); } 40 41 void pop() 42 { 43 if(_cont.empty()) 44 throw exception_type(); 45 _cont.pop_front(); 46 } 47 48 reference front() 49 { 50 if(_cont.empty()) 51 throw exception_type(); 52 return _cont.front(); 53 } 54 55 const_reference front() const 56 { 57 if(_cont.empty()) 58 throw exception_type(); 59 return _cont.front(); 60 } 61 62 reference back() 63 { 64 if(_cont.empty()) 65 throw exception_type(); 66 return _cont.back(); 67 } 68 69 const_reference back() const 70 { 71 if(_cont.empty()) 72 throw exception_type(); 73 return _cont.back(); 74 } 75 76 bool empty() const { return _cont.empty(); } 77 size_type size() const { return _cont.size(); } 78 79 const_container_reference get_container() const 80 { return _cont; } 81 82 friend bool operator== (const Queue &a, const Queue &b) 83 { return a._cont == b._cont; } 84 85 friend bool operator!= (const Queue &a, const Queue &b) 86 { return a._cont != b._cont; } 87 88 friend bool operator>= (const Queue &a, const Queue &b) 89 { return a._cont >= b._cont; } 90 91 friend bool operator<= (const Queue &a, const Queue &b) 92 { return a._cont <= b._cont; } 93 94 friend bool operator> (const Queue &a, const Queue &b) 95 { return a._cont > b._cont; } 96 97 friend bool operator< (const Queue &a, const Queue &b) 98 { return a._cont < b._cont; } 99 private: 100 container_type _cont; 101 }; 102 103 template <typename T, typename Container> 104 template <typename T2, typename Container2> 105 Queue<T, Container>::Queue(const Queue<T2, Container2> &s) 106 :_cont(s.get_container().begin(), s.get_container().end()) 107 { } 108 109 template <typename T, typename Container> 110 template <typename T2, typename Container2> 111 Queue<T, Container> &Queue<T, Container>::operator= (const Queue<T2, Container2> &s) 112 { 113 if((void *)this != (void *)&s) 114 { 115 _cont.assign(s.get_container().begin(), s.get_container().end()); 116 } 117 return *this; 118 } 119 #endif
测试代码如下:
1 #include "stack.hpp" 2 #include "queue.hpp" 3 #include <iostream> 4 #include <string> 5 #include <vector> 6 #include <list> 7 #include <stdio.h> 8 using namespace std; 9 10 int main(int argc, char const *argv[]) 11 { 12 13 try 14 { 15 Queue<string, vector<string> > st; 16 st.push("foo"); 17 st.push("bar"); 18 19 Queue<string, list<string> > st2(st); 20 //st2 = st; 21 22 while(!st2.empty()) 23 { 24 cout << st2.front() << endl; 25 st2.pop(); 26 } 27 28 st2.pop(); //引发异常 29 } 30 catch (const Exception& ex) 31 { 32 fprintf(stderr, "reason: %s ", ex.what()); 33 fprintf(stderr, "stack trace: %s ", ex.stackTrace()); 34 } 35 36 return 0; 37 }
测试结果如下:
foo bar reason: read empty queue stack trace: ./a.out() ./a.out() ./a.out() ./a.out() ./a.out() /lib/libc.so.6(__libc_start_main+0xe6) ./a.out()