关于c++:CSTL教程2queue队列容器小白都能看懂的讲解

3次阅读

共计 2118 个字符,预计需要花费 6 分钟才能阅读完成。

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

本文将介绍 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 容器是什么?实用教程来啦!](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';// 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()。

本文到此结束啦,感激大家的浏览!

如果这篇文章对你有帮忙欢送珍藏,点赞,关注我的账号!

正文完
 0