C++之STL--queue模板类

queue
与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类

型,元素类型是必要的,容器类型是可选的,默认为deque 类型。可选的容器类型有queue,list,但是不能用vector;


queue的核心接口主要由成员函数push(),front(),back(),pop()构成;

push():会将一个元素置入queue中;

front():会返回queue内的第一个元素(也就是第一个被置入的元素)

back():会返回queue中的最后一个元素(也就是最后被插入的元素)

pop():会移除queue内的第一个元素(也就是第一个被置入的元素)

注意:
(1)front()和back()仅仅只是返回元素,并不对queue中的元素移除,所以多次执行这两个成员函数,而不执行pop(),返回的结果一样;

(2)pop()虽然执行移除操作,但是并不返回被移除对象的值;

(3)如果想返回queue的元素,并移除返回的元素,就要同时执行fornt()和pop();

(4)如果queue内没有元素,那么front(),back(),pop()的执行都会导致未定义的行为,所以在执行这三个操作是,可以通过size()和empty()判断容器是否为空;


代码示例:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include<queue>  
  3. #include<string>  
  4.   
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     queue<string> q;  
  10.   
  11.     q.push("These ");  
  12.     q.push("are ");  
  13.     q.push("more than ");  
  14.   
  15.     cout<<"back: "<<q.back()<<endl;//返回queue中最后一个元素(也就是最后被插入到队列内的元素)  
  16.     cout<<"back: "<<q.back()<<endl;  
  17.   
  18.     cout<<q.front();//返回queue内的第一个元素(也就是最先被插入到队列内的元素)  
  19.     q.pop();//移除queue中的第一个元素  
  20.   
  21.     cout<<q.front();  
  22.     q.pop();  
  23.   
  24.     q.push("four ");  
  25.     q.push("words!");  
  26.     q.pop();  
  27.   
  28.     cout<<q.front();  
  29.     q.pop();  
  30.   
  31.     cout<<q.front();  
  32.     q.pop();  
  33.   
  34.     cout<<endl;  
  35.   
  36.     cout<<"number of elements in the queue: "<<q.size()<<endl;  
  37.   
  38.     system("pause");  
  39.     return 0;  
  40. }  

运行结果:



自己重写queue类,pop()会返回下一个元素,如果queue为空,pop(),front(),back()会抛出异常。

queue.h

[cpp]  view plain  copy
  1. #ifndef QUEUE_H  
  2. #define QUEUE_H  
  3.   
  4. #include<deque>  
  5. #include<exception>  
  6.   
  7. template<class T>  
  8. class Queue  
  9. {  
  10. protected:  
  11.     std::deque<T> c;  
  12. public:  
  13.     class ReadEmptyQueue:public std::exception  
  14.     {  
  15.     public:  
  16.         virtual const char* what() const throw()  
  17.         {  
  18.             return "read empty queue";  
  19.         }  
  20.     };  
  21.     typename std::deque<T>::size_type size() const   
  22.     {  
  23.         return c.size();  
  24.     }  
  25.     bool empty() const  
  26.     {  
  27.         return c.empty();  
  28.     }  
  29.     void push(const T& elem)  
  30.     {  
  31.         c.push_back(elem);  
  32.     }  
  33.       
  34.     T& back()  
  35.     {  
  36.         if(c.empty())  
  37.         {  
  38.             throw ReadEmptyQueue();  
  39.         }  
  40.         return c.back();  
  41.     }  
  42.       
  43.     T& front()  
  44.     {  
  45.         if(c.empty())  
  46.         {  
  47.             throw ReadEmptyQueue();  
  48.         }  
  49.         return c.front();  
  50.     }  
  51.     T pop()  
  52.     {  
  53.         if(c.empty())  
  54.         {  
  55.             throw ReadEmptyQueue();  
  56.         }  
  57.         T elem(c.front());  
  58.         c.pop_front();  
  59.         return elem;  
  60.     }  
  61. };  
  62.   
  63. #endif  

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include"queue.h"  
  3. #include<string>  
  4.   
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     try  
  10.     {  
  11.         Queue<string> q;  
  12.   
  13.         q.push("These ");  
  14.         q.push("are ");  
  15.         q.push("more than ");  
  16.   
  17.         cout<<"back: "<<q.back()<<endl;//返回queue中最后一个元素(也就是最后被插入到队列内的元素)  
  18.         cout<<"back: "<<q.back()<<endl;//两次返回结果一样  
  19.   
  20.         cout<<q.pop();  
  21.         cout<<q.pop();  
  22.   
  23.         q.push("four ");  
  24.         q.push("words!");  
  25.         q.pop();  
  26.   
  27.         cout<<q.pop();  
  28.         cout<<q.pop();  
  29.   
  30.         cout<<endl;  
  31.   
  32.         cout<<"number of elements in the queue: "<<q.size()<<endl;  
  33.   
  34.         cout<<q.pop()<<endl;//测试异常  
  35.     }  
  36.     catch(const exception& e)  
  37.     {  
  38.         cerr<<"EXCEPTION: "<<e.what()<<endl;  
  39.     }  
  40.   
  41.     system("pause");  
  42.     return 0;  
  43. }  

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值