前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[C++STL教程]2.queue队列容器,小白都能看懂的讲解!

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

原创
作者头像
Eriktse
发布2023-03-16 20:45:30
2690
发布2023-03-16 20:45:30
举报
文章被收录于专栏:编程技巧编程技巧

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

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

什么是队列?

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

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

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

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

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

队列的初始化

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

代码语言:c++
复制
#include <queue>

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

代码语言:c++
复制
queue<T> q; // 其中T为数据类型

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

插入元素

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

代码语言:c++
复制
q.push(1);
q.push(4);
q.push(5);

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

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

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

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

代码语言:c++
复制
q.emplace(1);
q.emplace(2);
q.emplace(3);

//这个q接着上一个例子
//q: 1 4 5 1 2 3

弹出元素

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

代码语言:c++
复制
//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(),返回值为一个非负整数。

代码语言:c++
复制
cout << q.size() << '\n';

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

判断队列是否为空

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

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

代码语言:c++
复制
if(q.empty())cout << "队列为空" << '\n';
else cout << "队列非空" << '\n';

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

代码语言:c++
复制
//当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

代码语言:c++
复制
//方法一:
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值表示两个队列是否相等。

看下面这个例子:

代码语言:c++
复制
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()。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是队列?
  • 队列的初始化
  • 插入元素
  • 弹出元素
  • 获取队列大小
  • 判断队列是否为空
  • 清空队列
  • 判断两个队列是否相同(很少用到)
  • 队列常用函数总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档