说明:本文仅供学习交流,转载请标明出处,欢迎转载!

上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL内部定义的第二种STL容器适配器queue(队列)。

对于接触过数据结构的人来说,队列并不陌生,它是一种FIFO(first in first out)的数据结构。与栈相比,队列的不同之处在于:(1)队列是一种先进先出的数据结构,而栈则是一种后进先出的数据结构;(2)队列支持首尾两端的訪问操作,而栈仅仅支持一端(即顶端)的訪问操作;(3)队列从队尾插入,从队首弹出;而栈的插入和弹出都位于栈顶。当然,容器适配器queue与stack有个共同之处是,两者都不支持遍历操作,内部并不提供迭代器。

从上面的对照我们分析我们可以判断出这两种适配器对基础容器的要求是不一样的,如上面所提到的第(3)点差别:queue的基础容器必须支持可以从首部弹出,而stack的基础容器必须支持尾部弹出。换句话说,queue的基础容器必须支持pop_front()操作,而stack的基础容器必须支持pop_back()操作。正由于这一点,顺序容器vector、list和deque均可作为stack的基础容器,而list和deque可作为queue的基础容器,而vector则不能作为queue的基础容器(由于vector)不提供pop_front()操作,这两个适配器的默认基础容器均为deque

依据stack和queue操作的差别,我们能够对照分析stack和queue所提供操作的不同。

queue所提供的操作例如以下:

(1)获取当前队列中元素的个数。size_type size(),stack也提供该操作

(2)获取队首元素(不弹出)。T & front(),stack不提供该操作

(3)获取队尾部元素(不弹出)。T & back(),stack相应的函数为T & top()

(4)入队操作。void push(const T &t),stack也提供一样的函数,相应为入栈操作

(5)出队操作。void pop(),stack也提供一样的函数,相应为出栈操作

(6)推断队列是否为空。bool empty(),stack也提供一样的函数

假设想使用STL中定义的queue适配器,须要引用queue头文件,#include<queue>。

以下给出queue适配器的实现代码和測试代码:

#include<iostream>
#include<deque>
using namespace std; /****************queque的定义*************/
template<class T,class Sequence=deque<T> >
class queue
{
friend bool operator==(const queue& x,const queue& y);
friend bool operator<(const queue&x,const queue& y);
/****************容器适配器queue公有属性*********************/
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;//基础容器
/*************queue的经常使用操作****************/
public:
bool empty()const;//推断是否为空
size_type size()const;//元素个数
reference front();//获取队首元素
const_reference front()const;
reference back();//获取队尾元素
const_reference back()const ;
void push(const value_type& x);//进队列
void pop();//出队操作
}; /***************queue类外实现***************/
template<class T,class Seq>
bool queue<T,Seq>::empty()const//推断队列是否为空队列,const在类外实现的时候也不能省
{
return c.empty();
} template<class T,class Seq>
typename queue<T,Seq>::size_type queue<T,Seq>::size()const//返回队列内元素的个数
{
return c.size();
} template<class T,class Seq>
typename queue<T,Seq>::reference queue<T,Seq>::front()//获取队首元素
{
return c.front();
} template<class T,class Seq>
typename queue<T,Seq>::const_reference queue<T,Seq>::front()const//返回队首元素的常引用
{
return c.front();
} template<class T,class Seq>
typename queue<T,Seq>::reference queue<T,Seq>::back()//取队尾元素的引用
{
return c.back();
} template<class T,class Seq>
typename queue<T,Seq>::const_reference queue<T,Seq>::back()const//取队尾元素的引用
{
return c.back();
} template<class T,class Seq>
void queue<T,Seq>::push(const value_type& t)//压队列
{
c.push_back(t);
} template<class T,class Seq>
void queue<T,Seq>::pop()//出队列
{
c.pop_front();
}
int main()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
while(!q.empty())
{
cout<<"size="<<q.size()<<" ";
cout<<q.front()<<endl;
q.pop();
}
return 0;
}

參考资料

[1]《STL源代码剖析 侯捷》

[2]《C++Primer 第4版》

STL之容器适配器queue的实现框架的更多相关文章

  1. STL之容器适配器stack的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter).我们就想到了早期用电话线上网所用的调制解调器,俗称"猫"."猫"的作用是实现 ...

  2. 初步STL该容器适配器

    容器适配器 特点 容器一定的顺序来实现(让现有的以集装箱堆放/式工作) 分类 1) stack: 头文件 <stack> • 栈 -- 后进先出 2) queue: 头文件 <que ...

  3. 容器适配器————queue

    只能访问 queue<T> 容器适配器的第一个和最后一个元素.只能在容器的末尾添加新元素,只能从头部移除元素. 操作 queue<int> q;//创建一个int型的空队列q ...

  4. STL之容器适配器priority_queue

    priority_queue(优先队列)是一个拥有权值观念的queue,它允许加入新元素,删除旧元素,审视元素值等功能.由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素, 除此之外别 ...

  5. STL标准库-容器适配器

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class ...

  6. 容器适配器(一):queue

    除了标准的顺序容器外,STL还提供了3种容器适配器,queue,priority_queue和stack 适配器是对顺序容器的包装,它的作用是简化接口. queue接口十分的简单,只有8个方法.再加上 ...

  7. 容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

    一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/d ...

  8. c++ STL容器适配器

    一.标准库顺序容器适配器的种类     标准库提供了三种顺序容器适配器:queue(FIFO队列).priority_queue(优先级队列).stack(栈)   二.什么是容器适配器     &q ...

  9. STL中容器的push()或者push_back()函数的一点说明

    在STL的queue 或者 vector.list等容器适配器或者容器中,会经常用到的函数就是push()或者push_back()函数,但是有一点需要明确的是: 在使用这些函数对容器/适配器对象增加 ...

随机推荐

  1. android中Sensor 工作流程

    JAVA 程序 我们使用 sensor 接口一般只要注册一下 SensorListener 像下面这样 ************************************************ ...

  2. Spring整合Jms学习(三)_MessageConverter介绍

    1.4     消息转换器MessageConverter MessageConverter的作用主要有双方面,一方面它能够把我们的非标准化Message对象转换成我们的目标Message对象,这主要 ...

  3. XSS跨站攻击

    目录 1 XSS跨站攻击简介 1 1.1 什么是XSS 1 1.2 XSS的分类 1 1.3 XSS的危害 1 2 XSS的攻击原理 1 2.1 本地式漏洞攻击 1 2.2 存储式漏洞攻击 2 2.3 ...

  4. 【译】ASP.NET MVC 5 教程 - 8:搜索查询

    原文:[译]ASP.NET MVC 5 教程 - 8:搜索查询 添加一个搜索的方法和搜索的视图 在本节中,我们为 Index 方法添加查询功能,使我们能够根据电影的题材或名称进行查找. 修改 Inde ...

  5. hdu1698(线段树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 线段树功能:update:成段替换 (由于只query一次总区间,所以可以直接输出1结点的信息) ...

  6. UVA12304 2D Geometry 110 in 1! 计算几何

    计算几何: 堆几何模版就能够了. . .. Description Problem E 2D Geometry 110 in 1! This is a collection of 110 (in bi ...

  7. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  8. Linux php/php-fpm 安装,配置

    1> 下载php源代码   #wget  http://cn2.php.net/get/php-5.4.30.tar.gz/from/this/mirror   官网5.2的版本号貌似没提供   ...

  9. 辛星与您使用CSS导航条

    第一步.我们创建了一个新的my.html档.在内容填入如下面.这个html文件不动,直到最后.正是这些内容: <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...

  10. POJ 2299 Ultra-QuickSort (求序列的逆序对数)

    题意:废话了一大堆就是要你去求一个序列冒泡排序所需的交换的次数. 思路:实际上是要你去求一个序列的逆序队数 看案例: 9 1 0 5 4 9后面比它小的的数有4个 1后面有1个 0后面没有 5后面1个 ...