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

本文将介绍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. LeetCode 删除数组中重复项 26 80

    26(80) 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素只出现一次(使得出现次数超过两次的元素只出现两次 ) ,返回删除后数组的新长度.元素的 相对顺序 应该保 ...

  2. Django框架搭建web项目(三)

    参考官网文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial02/ 在生成的app中进行数据库表设计. 1.在路径H:\myproj ...

  3. @Transactional详细介绍

    @Transactional在设置的时候有以下几个主要属性可以设置, 1.propagation:分别为事务的传播行为; 2.isolation:事务的隔离级别; 3.readOnly读写事务控制; ...

  4. Servlet执行步骤

    <!-- 1. 用户发请求,action=add 2. 项目中,web.xml中找到url-pattern = /add -> 第12行 3. 找第11行的servlet-name = A ...

  5. Java实现简单的大顶堆

    Java实现简单的大顶堆 今天刷LeetCode的347. 前 K 个高频元素的时候使用到了优先队列,由于对大顶堆掌握不算熟练,于是写了一个简单大顶堆练手: 实现代码在最后 之前很少使用泛型来写代码, ...

  6. Qt之新建界面动态库并使用

    动态库的创建 动态库的使用 动态库的创建 //SharedLib_global.h #ifndef SHAREDLIB_GLOBAL_H #define SHAREDLIB_GLOBAL_H #inc ...

  7. linux 串口查看信息

    查看串口是否可用,可以对串口发送数据比如对com1口,echo helloworld >/dev/ttyS0 [root@H3LINUX90 ~]# echo helloworld >/d ...

  8. CF823div2B

    cf823div2B 题目链接 题目大意 多组测试数据,有\(n\)个点在数轴上,他们想要集会,每个点到目标点\(y\)的时间为$$t_i+|x_i-y|$$ 试求所有点到\(y\)中最长时间的最小值 ...

  9. js数组原型方法

    今天学习了一下js数组原型的操作方法,小结一下学习地址https://www.cnblogs.com/obel/p/7016414.html 1.join() join(separator): 将数组 ...

  10. Q:oracle锁表如何处理

    解决ORA-00054资源正忙的问题 有时候在drop表或者其他对象的时候,会遇到ORA-00054:资源正忙,要求指定NOWAIT(中文字符集)或者ORA-00054: resource busy ...