当前位置: 首页 > news >正文

STL之容器适配器queue的实现框架

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

         上篇文章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版》

相关文章:

  • DNS添加/修改/查询/删除A记录
  • 大道至简 电话号码重新成为O2O新宠
  • tomcat日志catalina.out 按天分片分割
  • 【Android-视频播放】实用vitamio自定义控制条位置
  • HBase之MemStore+Flush详解
  • Pair Project 1 elevator
  • DISCUZ 学习笔记四 SEO 设置 板块 分区 导航 模板 修改浏览器标签powerbydis
  • JVM 运行时数据区域
  • JVM调优的几种策略(转)
  • JavaScript生成GUID的方法
  • 领悟得太迟
  • 关于最近WIN7系统错误711的解决办法
  • 如何重现难以重现的bug
  • tcp/ip
  • Oracle笔记 一、oracle的安装、sqlplus的使用
  • php的引用
  • hexo+github搭建个人博客
  • 《深入 React 技术栈》
  • CSS3 变换
  • jquery cookie
  • Linux快速复制或删除大量小文件
  • Lucene解析 - 基本概念
  • SpringBoot 实战 (三) | 配置文件详解
  • 机器学习 vs. 深度学习
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #微信小程序:微信小程序常见的配置传旨
  • $.each()与$(selector).each()
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)二分查找 超详细
  • (Matlab)使用竞争神经网络实现数据聚类
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)计算机毕业设计高校学生选课系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)EOS中账户、钱包和密钥的关系
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ..回顾17,展望18
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net 受管制代码
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • [ Linux ] Linux信号概述 信号的产生
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [Android]通过PhoneLookup读取所有电话号码
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C++]AVL树怎么转
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [DL]深度学习_Feature Pyramid Network
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • [IE编程] IE中对网页进行截图的编程接口