在学习数据结构的时候咱们会听到这样一个词:队列。
本文将介绍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容器是什么?实用教程来啦!](https://www.eriktse.com/algorithm/1051.html)
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';// 0t.emplace(1);cout << (q ====== t) << '\n';// 1q.pop();cout << (q ====== t) << '\n';// 0t.pop();cout << (q ==== t) << '\n';// 1
队列罕用函数总结
- push() 在队尾插入一个元素,入队
- pop() 删除队列第一个元素,出队
- size() 返回队列中元素个数,即队列大小
- empty() 如果队列空则返回
true
,反之则false
- front() 返回队列中的第一个元素,即队头元素
- back() 返回队列中最初一个元素,即队尾元素
用front()获取队头并不会主动把头弹出,如果须要弹出记得加一个pop()。
本文到此结束啦,感激大家的浏览!
如果这篇文章对你有帮忙欢送珍藏,点赞,关注我的账号!