在学习数据结构的时候我们会听到这样一个词:队列。

本文将介绍STL中的队列:queue

本文仅从入门和实用角度介绍queue的用法,主要针对初学者或竞赛向。如有不严谨的地方欢迎指正!本文长度约2000字,阅读大约需5分钟。

什么是队列?

队列是一种FIFO,即First In First Out的数据结构,就像是小朋友排队一样,所有元素都只能从队尾(rear / back)进,队头(front)出,队列内的元素保持着入队时的顺序

这时候有小伙伴可能会问:队列能做的,数组都能模拟,为什么还要队列呢?

我们要知道的是,我们学习队列并非学习队列这个结构本身, 而是学习其中蕴含的思想,用于解决复杂的问题。

知乎回答:https://www.zhihu.com/question/457210423

队列和其他C++的标准库容器一样,都只能存放相同的数据类型。如果要尝试存放任意类型,可以去了解一下<any>这个库。

队列的初始化

在使用queue前,需要引入头文件。

#include <queue>

用以下的代码初始化一个空队列:

queue<T> q; // 其中T为数据类型

接下来的操作都针对q这个实例化对象。

插入元素

语法:q.push(x), xq中存放的类型的变量。

q.push(1);
q.push(4);
q.push(5); //q: 1(front) 4 5 (rear)

我们认为队头的元素为front,而队尾元素的后面一个位置是rear,符合计算机中常见的“左闭右开”的标准。

还有一种办法,就是用q.emplace()函数进行入队,它和push用法相同单有略微差异但是初学者可以忽略。

此函数用于将新元素插入队列容器,并将新元素添加到队列的末尾。

q.emplace(1);
q.emplace(2);
q.emplace(3); //这个q接着上一个例子
//q: 1 4 5 1 2 3

弹出元素

语法:q.pop(),将队头元素弹出。

//q: 1(front)  4  5  (rear)

q.pop();
//q: 4(front) 5 (rear) q.pop();
//q: 5(front) (rear) q.pop();
//q: (empty) q.pop();//错误!

值得注意的是,当队列为空的时候弹出元素会导致错误,所以我们在每一步pop()操作的时候一定要判断队列是否为空,除非你有十足的把握。

本文为eriktse原创,未经允许禁止转载。

获取队列大小

语法:size(),返回值为一个非负整数。

cout << q.size() << '\n';

q.size() == 0时,队列为空。

判断队列是否为空

语法:empty(),返回值为bool

用法和vector类似,感兴趣的可以看这篇文章:[C++STL教程]1.vector容器是什么?实用教程来啦!

if(q.empty())cout << "队列为空" << '\n';
else cout << "队列非空" << '\n';

当然还可以通过判断队列的大小来判断是否为空。

//当q.size() > 0时,其bool值为true,队列非空

if(q.size())cout << "队列非空" << '\n';
else cout << "队列为空" << '\n';

清空队列

有时候我们需要将队列清空,但是queue并没有像vector那样的clear函数,怎么做呢?

这里提供3种方法:(参考:https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/82585383)

//方法一:
while(!q.empty())q.pop(); //方法二:
q = queue<int>();//直接赋值一个新的queue //方法三:
template<class T>
void clear(queue<T> &q)
{
queue<T> empty();
swap(empty, q);
} clear(q);

有同学可能会疑惑这三种方法的效率有没有什么区别,我实测了一下,几乎没有区别。在我的电脑上清空一个大小为1e6的队列,时间约为700ms

判断两个队列是否相同(很少用到)

语法:q1 ==== q2,返回一个bool值表示两个队列是否相等。

看下面这个例子:

queue<int> q, t;

q.push(1);
cout << (q ====== t) << '\n';// 0 t.emplace(1);
cout << (q ====== t) << '\n';// 1 q.pop();
cout << (q ====== t) << '\n';// 0 t.pop();
cout << (q ==== t) << '\n';// 1

队列常用函数总结

  • push() 在队尾插入一个元素,入队
  • pop() 删除队列第一个元素,出队
  • size() 返回队列中元素个数,即队列大小
  • empty() 如果队列空则返回true,反之则false
  • front() 返回队列中的第一个元素,即队头元素
  • back() 返回队列中最后一个元素,即队尾元素

用front()获取队头并不会自动把头弹出,如果需要弹出记得加一个pop()。

本文到此结束啦,感谢大家的阅读!

如果这篇文章对你有帮助欢迎收藏,点赞,关注我的账号!

[C++STL教程]2.queue队列容器,小白都能看懂的讲解!的更多相关文章

  1. 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)

    一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...

  2. gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

    什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...

  3. 小白都能看懂的Spring源码揭秘之IOC容器源码分析

    目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...

  4. Unity 打包发布Android新手教学 (小白都能看懂的教学 ) [转]

    版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 扫码关注微信公众号,获取最新资源 最近在Unity的有些交流群里,发现好多Unity开发 ...

  5. 小白都能看懂的Linux系统下安装配置Zabbix

    实验环境: 操作系统:Centos 7.6 服务器ip:192.168.10.100 运行用户:root 网络环境:Internet Zabbix是一个基于web界面的提供分布式系统监控及网络功能的企 ...

  6. 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析

    目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireC ...

  7. Spring Cloud Alibaba分布式事务组件 seata 详解(小白都能看懂)

    一,什么是事务(本地事务)? 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列.      而一个逻辑工作单元要成 ...

  8. 小白都能看懂的 Spring 源码揭秘之Spring MVC

    目录 前言 Spring MVC 请求流程 Spring MVC 两大阶段 初始化 HttpServletBean#init() FrameworkServlet#initServletBean Fr ...

  9. 小白都能看懂的vue中各种通信传值方式,附带详细代码

    1.路由通信传值 路由通信是通过路由跳转用query把参数带过去,也是vue常用的通信手段. 例子: 创建并在路由注册一个组件Head <template> <div id=&quo ...

  10. log4j漏洞的产生原因和解决方案,小白都能看懂!!!!

    核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止 产生原因 其实这 ...

随机推荐

  1. ios怎么在自己公司网站扫描下载安装IPA安装包

    企业证书(或者99的证书,但是有100个设备限制)打包的IPA安装包,怎么发布给用户安装使用呢? 试了直接给用户.ipa包的链接,手机不能像安卓手机那样安装,平时我们测试放在蒲公英的包蒲公英应该是有做 ...

  2. mangodb查询语句

    1.查询所有记录 db.userInfo.find(); 相当于: select* from userInfo; 默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据.注意:键 ...

  3. jquery.min.js:2 Uncaught SyntaxError: Unexpected identifier

    错误描述:样式没加载出错,还没发起action请求,action有断点,后端无报错. 错误原因:找了好久,知道是url请求路径错误,搞了几次不对.重新对比url发现是路径拼接错误.注意单引号和双引号. ...

  4. 身为一个java开发人员对目前java开发的一些小小的认识

    为什么要学java? 第一要工作,第二想要高薪 首先身为java开发工作人员你的思想认知程度要搞,思想认知程度决定你的专业技能水平 JavaSE工程师     B/S 架构   ----    浏览器 ...

  5. PHP、Navicat安装

    一.PHPStudy小皮面板:https://public.xp.cn/upgrades/phpStudy_64.zip 下载完成后解压后双击 点击立即安装 安装完成 启动MySQL,Nginx(my ...

  6. Microsoft Edge 浏览器中 Vue.js devtools 插件安装与使用

    下载插件 通过插件下载网站crx4chrome搜索下载,也可以直接百度"site:(www.crx4chrome.com) Vue.js Devtools"找到下载页面下载 或者通 ...

  7. VMWare安装CentOS 7系统 & 操作系统优化

    1.准备工作 (1)VMWare 14:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-14.1.1-7 ...

  8. jetson nano 2gb相关问题

    1.create_ap不能根据address设置带设备号的wifi热点 sudo nohup create_ap wlan0 eth0 ZL_Jetson_WIFI-$(sudo cat /sys/c ...

  9. vue移动端购物商场首页制作

    1.搭建项目框架 新建首页主组件及其子组件并将子组件展示出来 2.封装所需接口 3.编写轮播图组件 <template> <div id="swipercom"& ...

  10. 划分数据集时出现PermissionError: [Errno 13] Permission denied:

    PermissionError: [Errno 13] Permission denied: [errno 13]权限被拒绝 错误的原因可能是文件找不到,或者被占用,或者无权限访问,或者打开的不是文件 ...