博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL之容器适配器queue的实现框架
阅读量:5923 次
发布时间:2019-06-19

本文共 2808 字,大约阅读时间需要 9 分钟。

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

         上篇文章已经介绍了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
#include
using namespace std;/****************queque的定义*************/template
>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
bool queue
::empty()const//推断队列是否为空队列,const在类外实现的时候也不能省{ return c.empty(); }template
typename queue
::size_type queue
::size()const//返回队列内元素的个数{ return c.size();}template
typename queue
::reference queue
::front()//获取队首元素{ return c.front();}template
typename queue
::const_reference queue
::front()const//返回队首元素的常引用{ return c.front();}template
typename queue
::reference queue
::back()//取队尾元素的引用{ return c.back();}template
typename queue
::const_reference queue
::back()const//取队尾元素的引用{ return c.back();}template
void queue
::push(const value_type& t)//压队列{ c.push_back(t);}template
void queue
::pop()//出队列{ c.pop_front();}int main(){ queue
q; q.push(1); q.push(2); q.push(3); q.push(4); while(!q.empty()) { cout<<"size="<
<<" "; cout<
<

參考资料

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

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

你可能感兴趣的文章
SQL Server:数据库角色
查看>>
多标签主界面使用TRzPageControl
查看>>
对技术的态度—CoolShell 陈皓
查看>>
佛家十大经典禅语
查看>>
DinnerNow案例分析
查看>>
Web Farm和Web Garden的区别
查看>>
STL - 迭代器 - 安插型迭代器
查看>>
IIs7 报错
查看>>
POJ 1739 Tony's Tour(插头DP)
查看>>
设计模式
查看>>
科学版欲望都市:爱与性的实验报告
查看>>
一些程序的整理
查看>>
WinXp共享
查看>>
Asp.Net编码
查看>>
struts请求参数注入的三种方式
查看>>
jstl表达式
查看>>
两个不等式(Nopier)
查看>>
ceRNA 调控机制
查看>>
C 枚举 相同的值
查看>>
CRONTAB调用备份脚本时要注意环境变量的设置
查看>>