queue源码
queue概述
queue是一种先进先出的数据结构,允许新增元素、移除元素,queue只允许从底端加入元素,从顶端移除元素,不允许有遍历行为。
queue定义
以某种既有容器作为底部结构,将其接口改变,使之符合"先进先出"的特性,形成一个queue,是很容易做到的,deque是双向开口的数据结构,若以deque以底端的出口以及前端的入口,便轻易举起形成一个queue。
由于queue系以底部容器完成其所有工作,而具有这种性质,称为adapter(配接器),因此,STL stack往往不被归类为container(容器),而被归类为container adapter。
template <class T,class Sequence=deque<T> > class queue { friend bool operator==__STL_NULL_TMPL_ARGS(const queue& x,const queue& y); friend bool operator<__STL_NULL_TMPL_ARGS(const queue& x,const queue& y); public: typedef typename Sequence::value_type value_type; typedef typename Sequence::size_type size_type; typedef typename Sequence::reference reference; typedef typename Sequence::const_reference const_reference; protected: Sequence c;//底层容器 public: //以下利用Sequence(也就是deque)实现queue bool empty() const{return c.empty();} size_type size() const{return c.size();} reference front() const{return c.font();} const_reference front() const{return c.font();} reference back() const{return c.back();} const_reference back() const{return c.back();} void push(const value_type&){c.push_back(x);} void pop(){c.pop_front();} }; template <class T,class Sequence> bool operator ==(const queue<T,Sequence>& x,const queue<T,Sequence>& y){ return x.c==y.c; } template <class T,class Sequence> bool operator <(const queue<T,Sequence>& x,const queue<T,Sequence>& y){ return x.c<y.c; }
queue没有迭代器
queue是先进先出的数据结构,不允许遍历,所以queue不提供迭代器。
以list作为queue底层容器
除了deque之外,list也是双向开口的数据结构。上述queue源码中使用的底层容器的函数有empty、size、back、push_back、pop_back,list也都具备,因此,若以list为底部结构并封闭其头端开口,一样能够形成一个stack,示范如下:
#include<bits/stdc++.h> using namespace std; int main(){ queue<int,list<int> > myqueue; myqueue.push(1); myqueue.push(3); myqueue.push(5); myqueue.push(7); cout<<myqueue.size()<<endl; //4 cout<<myqueue.front()<<endl; //1; myqueue.pop(); cout<<myqueue.front()<<endl; //3 myqueue.pop(); cout<<myqueue.front()<<endl; //5 myqueue.pop(); cout<<myqueue.front()<<endl; //7 cout<<myqueue.size()<<endl; //1 return 0; }