STL源码:queue
来源:互联网 发布:懒人桌 知乎 编辑:程序博客网 时间:2024/04/28 20:49
queue是先进先出(FIFO)的数据结构,有两个口:允许从尾部加入元素、取得头部的元素。没有其他任何方法可以存取queue的其它元素,即queue不允许遍历行为。
SGI STL以deque作为缺省情况下的queue底部结构,queue的实现很简单,代码十分简短。
queue没有迭代器。
为什么STL queue称为容器适配器而不是容器?
答:由于queue以底部容器完成其所有工作,而具有这种“修改某物接口,形成另外一种风貌”的性质,称为adapter(配置器),因此STL queue往往不归为容器,被视为容器适配器。
STL queue源码
// 如果编译器不能根据前面模板参数推导出后面使用的默认参数类型,// 那么就需要手工指定, 本实作queue内部容器默认使用deque// 由于queue要求在队尾追加元素, 在队头获取和移除元素// 所以非常适合使用deque#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class T, class Sequence = deque<T> >#elsetemplate <class T, class Sequence>#endifclass queue{// 讲解见<stl_pair.h>中的运算符剖析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:// 由于queue仅支持对队头和队尾的操作, 所以不定义STL要求的// pointer, iterator, difference_typetypedef 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:// 这些是STL queue的标准接口, 都调用容器的成员函数进行实现// 其接口和stack实现很接近, 参考<stl_stack.h> //以下完全利用Sequence c的操作完成queue的操作bool empty() const { return c.empty(); }size_type size() const { return c.size(); }reference front() { return c.front(); }const_reference front() const { return c.front(); }reference back() { return c.back(); }const_reference back() const { return c.back(); }void push(const value_type& x) { c.push_back(x); }void pop() { c.pop_front(); }};// 详细讲解见<stl_pair.h>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;}
list实现的queue
list也和deque一样,是双向开口的数据结构,list也可以作为底部结构并封闭其开口,形成一个queue。
代码如下:
#include <queue>#include <list>#include <iostream>#include <algorithm>using namespace std;int main() {queue<int, list<int> > iqueue;iqueue.push(1);iqueue.push(3);iqueue.push(6);cout << iqueue.size() << endl;cout << iqueue.front() << endl;iqueue.pop(); cout << iqueue.front() << endl;cout << iqueue.size() << endl;}
0 0
- STL源码:queue
- STL 源码剖析 queue
- STL源码—stack,queue
- STL源码—stack,queue
- STL源码剖析---stack,queue
- STL 之 queue、priority_queue 源码剖析
- STL源码剖析----stack、heap、queue
- STL源码剖析——queue
- STL--Queue
- STL QUEUE
- stl-queue
- stl queue
- stl queue
- stl queue
- STL queue
- STL queue
- STL-queue
- STL--queue
- Linux 虚拟内存和物理内存的理解
- lte-m
- 解决easyui tabs选中事件问题
- Linux 性能监控、测试、优化工具
- 初级java程序快速知道报错位置
- STL源码:queue
- 适用于移动开发人员的15个最好 Android 代码编辑器
- JAVA安全站点设置全局生效
- 关于淘宝自动登陆的尝试——神烦笔记
- 线程安全
- 解决表单提交参数乱码问题【终极版】不看后悔
- pl/sql连接server2003 tns无监听
- 黑马程序员——java基础---反射
- ajax发送请求,解决缓存问题