[C++STL教程]2.queue队列容器,小白都能看懂的讲解!
在学习数据结构的时候我们会听到这样一个词:队列。
本文将介绍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), x为q中存放的类型的变量。
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队列容器,小白都能看懂的讲解!的更多相关文章
- 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)
一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...
- gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程
什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大 ...
- 小白都能看懂的Spring源码揭秘之IOC容器源码分析
目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...
- Unity 打包发布Android新手教学 (小白都能看懂的教学 ) [转]
版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 扫码关注微信公众号,获取最新资源 最近在Unity的有些交流群里,发现好多Unity开发 ...
- 小白都能看懂的Linux系统下安装配置Zabbix
实验环境: 操作系统:Centos 7.6 服务器ip:192.168.10.100 运行用户:root 网络环境:Internet Zabbix是一个基于web界面的提供分布式系统监控及网络功能的企 ...
- 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析
目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireC ...
- Spring Cloud Alibaba分布式事务组件 seata 详解(小白都能看懂)
一,什么是事务(本地事务)? 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列. 而一个逻辑工作单元要成 ...
- 小白都能看懂的 Spring 源码揭秘之Spring MVC
目录 前言 Spring MVC 请求流程 Spring MVC 两大阶段 初始化 HttpServletBean#init() FrameworkServlet#initServletBean Fr ...
- 小白都能看懂的vue中各种通信传值方式,附带详细代码
1.路由通信传值 路由通信是通过路由跳转用query把参数带过去,也是vue常用的通信手段. 例子: 创建并在路由注册一个组件Head <template> <div id=&quo ...
- log4j漏洞的产生原因和解决方案,小白都能看懂!!!!
核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止 产生原因 其实这 ...
随机推荐
- opencv3 7.3 重映射 仿射变换
重映射的概念 将一幅图像某位置的像素放置到另外一幅图像的指定位置上,需要对非整数像素坐标重映射来表达每个像素的新位置. g(x,y)=f(h(x,y)); 实现重映射 remap()函数 dst(x, ...
- homework2软件方法论
什么是软件工程方法论? 1.软件工程是一个方法论,就是我们在开始一个项目时,大体框架一定要有这么一个概念,而具体实施时,必须根据公司一些特点,优化项目开发的流程,这样才是有实效而方法论只是软件工程的结 ...
- tex基础
Tex中输入空格以及换行 1. 使用\ 表示空格以及调整空格的大小quad空格 a \qquad b 两个m的宽度quad空格 a \quad b 一个m的宽度 ...
- SQL Server 错误:特殊符号“•”导致的sql查询问题
问题描述: 对于一些标题或字符串,例如: 如果导入数据库,就会发现会自动变成?号了: 在进行SQL查询的时候,会出现一个同一条sql语句在mysql直接执行sql可以查询到,但是mssql进行查询的时 ...
- PLC入门笔记3
熟悉开发环境 工具下载 官网失效 软件安装 官网失效 第一次PLC之旅 走廊灯两地控制案例 PLC型号确定 梯形图(LAD)和指令表(STL)两种编程方式 程序编辑 符号 变量类型 数据类型 注释 编 ...
- 复习笔记,javadoc生成文档总结
1.处理数字时候的内存溢出问题 //在处理大数字时候注意内存溢出问题 int i=10_0000_0000; //jdk7 中数字之间可以加入下划线不影响输出 ...
- 后台调用 WEBAPI 几种方式
示例是调用谷歌短网址的API. 1. HttpClient方式: public static async void DoAsyncPost() { DateTime dateBegin = DateT ...
- Jmeter检查点
一.Response Assertion(响应断言) 1. 添加响应断言 对Web请求的响应结果进行验证,Response Assertion配置参数 2. 输入需要匹配的字符串 此处对于访问Baid ...
- ABPvNext修改密码强度
ABPvNext 5.0之后,一些原有的修改密码强度的办法已经被抛弃无法正确使用.目前亲测有效的办法只有通过配置管理修改密码强度. 这里配置文件设置配置的方式,更多方法,可参见官方文档中的Settin ...
- 三种遍历的方法(map和forEach的区别)
一. for循环 arr[index]可以改变原数组 二. forEach方法 forEach方法的返回值是一个undefined: 2. 在循环体内改变item的值不会影响原数组,而是只在循环体内生 ...