- queue是一种先进先出的数据结构,他有两个出口
- 允许新增元素(从最底端 加入元素)、移除元素(从最顶端删除元素),除了对于顶端和底端元素进行操作之外,没有办法可以获取queue的其他元素
- 即queue没有遍历行为
基于deque的queue
- 针对deque进行操作,封闭其底部的出口 和 前端的入口
- queue不被归类为容器,而被归类为容器适配器
//定义在stl_config.h文件中
//但是没有找到 具体详情参见 参考链接
# ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
# define __STL_NULL_TMPL_ARGS <>
# else
# define __STL_NULL_TMPL_ARGS
# endiftemplate <class T,class Sequence = std::deque<T>>
class queue{//__STL_NULL_TMPL_ARGS会展开为 <>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 c的操作,完成stack的操作bool empty() const {return c.empty();}size_type size() const {return c.size();}reference front() {return c.back();}const_reference front() const {return c.front();}reference back() const {return c.back();}const_reference back() {return c.back();}//deque 是两头可以进出,queue 是末端进,前端出 (所以先进者先出)void push(const value_type& x){ c.push_back(x);}void pop(){return 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
- queue需要的函数如 empty、size()、back、push_back、pop_back是链表也支持的
- 使用范例
#include <list>
#include <queue>int main()
{std::queue<int,std::list<int>>list_queue;list_queue.push(1);list_queue.push(3);list_queue.push(5);list_queue.push(7);std::cout << list_queue.size() << std::endl; //4std::cout << list_queue.front() << std::endl; //1list_queue.pop();std::cout << list_queue.front() << std::endl; //3list_queue.pop();std::cout << list_queue.front() << std::endl; //5list_queue.pop();std::cout << list_queue.front() << std::endl; //7std::cout << list_queue.size() << std::endl; //1
}