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

本文将介绍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. 实验 四 [bx]和loop的使用

    1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. 代码  assume cs:code code segme ...

  2. 解决href 不下载直接跳转到新的页面

    1.下载 不支持所有浏览器 2 var eleTextarea = document.querySelector('textarea'); var eleButton = document.query ...

  3. Unity中实现在规定时间内从一个值递增到另一个值

    1.进度条(在规定时间内完成进度条) private Image progressBar; private float currentProgress = 0; /// <summary> ...

  4. 5.26 学习SSH

    1.ssh客户端是一种使用Secure Shell协议 连接到运行了ssh服务端的远程服务器上 ssh是比较可靠的,专为远程登录会话和其他网络服务提供安全性的协议 2.

  5. hdu1710 二叉树(C/C++)

    hdu1710 题目地址:https://acm.dingbacode.com/showproblem.php?pid=1710 (最近几天杭电原网址开不进去了,之后应该可以通..吧) Binary ...

  6. 蓝桥2021 B组

    2. 卡片(结果填空) 小蓝有很多数字卡片,每张卡片上都是数字 0 到 9. 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了. 小蓝想知道自 ...

  7. 2022竞赛新方法学习1--学习Proceedings of SAT Competition 2022 : Solver and Benchmark Descriptions

    Proceedings of SAT Competition 2022 : Solver and Benchmark Descriptions https://helda.helsinki.fi/ha ...

  8. P2504 聪明的猴子

    题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以 ...

  9. JAVA面经-基础篇-线程

    1.创建线程有哪几种方式?   创建线程有3种方式,分别是继承Thread类.实现Runnable类.实现Callable类.   继承Thread类的步骤:     1. 定义Thread类的子类, ...

  10. android 下载安装包更新app

    1下载 public void download(String url) { Utils.Loge("download",url); Uri uri = Uri.parse(url ...