c++的STL(8) -- queue

queue容器概述 

  •  queue容器实现了实现了和队列相同结构的容器。

 

如图,队列这种结构有两端:  队首和队尾。 对于队列,我们添加数据只能从队尾添加,删除数据只能从队首删除。是一种先进先出的结构。 --  当然读取数据也只能从队首或者队尾读取。

 

queue容器的实现 

queue也是一个模板类:

template <class _Ty, class _Container = deque<_Ty>>  class queue{}

上面就是其模板的类型参数,很明显,它接受两个参数,一个是其存储数据的类型,一个则是一个容器类型。 

为什么要接受一个容器类型呢? 

因为queue容器其实是在我们之前学习的deque,list容器的基础上,实现了其它的功能,其内部存储数据还是使用这三个容器(其内部定义了容器的对象)。


为什么要这么做呢?

因为,我们之前学习过的容器功能已经很强大了,但是在某些场景下它们的功能可能并不适用,但是重新开发新的容器也并不高效。

所以我们可以根据我们已有的容器,通过相应的封装和组合,实现对应的功能。

queue就是这样的一个容器,它在deque,list这三个容器的基础之上进行了封装,实现了符合栈结构的容器。(基于这种原理,我们也可以实现我们自己的容器)  --  对于queue而言这两个容器为基础容器。

 

queue中的函数 

表  queue容器适配器支持的成员函数
成员函数功能
empty()如果 queue 中没有元素的话,返回 true。
size()返回 queue 中元素的个数。
front()返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back()返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj)在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
emplace()在 queue 的尾部直接添加一个元素。
push(T&& obj)以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop()删除 queue 中的第一个元素。
swap(queue<T> &other_queue)将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。

注意: 我们前面说到,理论上deque可以使用vector,list,deque三个容器存储数据,但是具体情况还需要根据queue所要实现的功能来定。(就是看实现queue所需要的功能时用到的函数容器支不支持)

对与queue,只要容器支持  front()、back()、push_back()、pop_front()、empty() 和 size()这 6个成员函数就可以作为queue第二个模板类型参数。  --   因为queue是一个先进先出的结构,并且访问元素也只能访问队首和队尾的元素。 


queue需要基础容器支持pop_front();  所以vector容器是不能作为queue的基础容器的,因为它不支持此函数。

 

1. 创建queue对象 

创建一个不包含任何参数的对象

queue<int> q1;   // 创建了一个存储int数据的queue对象, 如果我们不传入第二个类型参数,那么默认使用deque作为queue的 基础容器。

指定queue容器的基础容器 

我们可以通过类型参数的第二个参数指定queue的基础容器,但是只能使用list,deque这两个容器中的一个。


queue<int,list<int>>  q1;   // 创建q1,我们指定了list容器作为queue容器的基础容器。

注意:  除去默认情况(使用deque容器为默认情况),我们要使用其它容器作为queue容器的基础容器,需要导入对应容器的头文件。

还有,虽然我们可以指定基础容器,但是默认的基础容器的效率是最高的。


比如:   使用list为基础容器,需要导入list头文件

#include <list> 

#inlcude <queue> 

queue<int,list<int>> q1; 

使用基础容器初始化stack容器。 

注意: 使用基础容器初始化queu容器,必须保证使用的基础容器和queu内部的基础容器是相同的。

deque<int> d1{ 1,2,3,4,5 };

// 使用别的容器初始化
queue<int> q1(d1);   // 使用deque容器的数据初始化queue,此时queue的基础容器应该为deque(也就是默认情况)。

list<int> l1{ 1,2,3,4,5 };

// 使用别的容器初始化
queue<int,list<int>> q1(l1);  // 使用list容器的数据初始化queue,此时queue的容器应该为vector。 

使用别的stack容器给stack初始化 

    list<int> l1{ 1,2,3,4,5 };
    // 使用别的容器初始化
    queue<int,list<int>> q1(l1);

    queue<int, list<int>> q2(q1);   // 方式1:  使用s1初始化s2
    queue<int, list<int>> q3 = s1; // 方式2:   使用s1初始化s3

 

2. queue容器中的函数 

  •  push(elem)

用于在队尾插入元素,函数内部其实是调用基础容器的push_back()方法在其尾部添加一个元素。//  因为队尾元素是最后位置的元素,所以对于基础容器就是在尾部添加数据。
 

  • pop()  --  无需参数

用于在队首删除元素,  函数内部其实是调用基础容器的pop_front()方法在其尾部添加一个元素。//  因为队首元素是最前面位置的元素,所以对于基础容器就是在首部删除数据。

  • 其余函数

其余函数和上面函数是一样的,都是通过调用内部基础容器的相应函数来实现功能,但是其用法和基础容器对应函数的用法是一样的,所以就不再说明了。

 

queue没有迭代器 

因为queue结构的原因,删除元素我们只能在对首删除,添加元素我们只能在队尾添加,查询元素也只能查询队首和队尾的元素,要想查询别的元素就需要将前面的元素出队,让查询的元素作为队首,我们才能查询到对应的元素。


在这种场景下,是不需要迭代器的,使用迭代器的话要想访问别的数据,就不一定需要出队了。 而使用迭代器,可以直接访问任意位置的元素,就会破坏这种结构。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python TensorFlow 2.6 获取 MNIST 数据

Python TensorFlow 2.6 获取 MNIST 数据 2 Python TensorFlow 2.6 获取 MNIST 数据1.1 获取 MNIST 数据1.2 检查 MNIST 数据 2 Python 将npz数据保存为txt3 Java 获取数据并使用SVM训练4 Python 测试SVM准确度 2 Python TensorFlow 2.6 获取 MNIST 数据 1.1 获取 MNIST 数据 …

【数据结构】考研真题攻克与重点知识点剖析 - 第 3 篇:栈、队列和数组

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

IP地址证书

IP地址证书是一种专为公网IP地址颁发的数字证书&#xff0c;它通过建立安全的HTTPS连接来确保数据传输的加密保护。 具体来说&#xff0c;IP地址证书有以下功能&#xff1a; 1.验证身份&#xff1a;IP地址证书可以证明您是与特定IP地址相关的合法用户或组织。这有助于防止网络…

使用 msys2 sshd为 windows 搭建 ssh 服务器

文章目录 概要整体架构流程技术名词解释MSYS2openSSH服务器 技术细节安装 MSYS2 环境安装openSSH配置、启动SSH 小结和扩展 概要 SSH服务器在Linux下的搭建一般的文章讨论的比较多了。在Windows下&#xff0c;我们常用Windows的Linux子系统来搭建ssh服务器。那有没有更好更简洁…

数据挖掘|关联分析与Apriori算法详解

数据挖掘|关联分析与Apriori算法 1. 关联分析2. 关联规则相关概念2.1 项目2.2 事务2.3 项目集2.4 频繁项目集2.5 支持度2.6 置信度2.7 提升度2.8 强关联规则2.9 关联规则的分类 3. Apriori算法3.1 Apriori算法的Python实现3.2 基于mlxtend库的Apriori算法的Python实现 1. 关联分…

京东云服务器4核8G主机租用价格418元一年,1899元3年

京东云轻量云主机4核8G服务器租用价格418元一年&#xff0c;1899元3年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 yunfuwuqiba.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如…

idea开发 java web 酒店推荐系统bootstrap框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 java 酒店推荐推荐系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式…

(西部数码)-域名注册购买实名流程

1&#xff0c;进入西部数码官网 输入网址 https://www.west.cn/services/domain/ 注册域名 &#xff0c;域名推荐com&#xff08;国际顶级域名&#xff09; &#xff0c;cn&#xff08;国内顶级域名&#xff09;。其中cn价钱比com便宜。 特别提醒&#xff1a; &#xff08;…

【C++】引用

目录 ​编辑 1.引用概念 2.引用特性 2.1一个变量可以取多个别名&#xff0c;别名还可以取别名 2.2一个别名不可以对应多个变量。 ​编辑2.3 别名的地址一样&#xff1a; 2.4引用必须初始化&#xff0c;必须有个引用实体 2.5 引用不能改变指向 3 .引用的价值和意义 3.1.做参数 …

关于 QSound播放wav音频文件,播放失败“using null output device, none available” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/137264493 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

【简单讲解下epoll】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

LabVIEW深度学习

目录 一、配置环境1.1、显卡选择1.2、下载显卡驱动1.3、下载并安装Anaconda1.4、配置Anaconda软件包下载服务器1.5、配置虚拟环境tf_gpu1.6、安装vscode1.7、安装tensorflow1.8、下载安装Git1.9、安装TensorFlow Object Detection API框架1.10、安装依赖的python软件包1.11、配…

包子凑数【蓝桥杯】/完全背包

包子凑数 完全背包 完全背包问题和01背包的区别就是&#xff0c;完全背包问题每一个物品能取无限次。 思路&#xff1a;当n个数的最大公约数不为1&#xff0c;即不互质时&#xff0c;有无限多个凑不出来的&#xff0c;即n个数都可以表示成kn&#xff0c;k为常数且不为1。当n个…

Vue关键知识点

watch侦听器 Vue.js 中的侦听器&#xff08;Watcher&#xff09;是 Vue提供的一种响应式系统的核心机制之一。 监听数据的变化&#xff0c;并在数据发生变化时执行相应的回调函数。 目的:数据变化能够自动更新到视图中 原理&#xff1a; Vue 的侦听器通过观察对象的属性&#…

Redis实战篇-集群环境下的并发问题

实战篇Redis 3.7 集群环境下的并发问题 通过加锁可以解决在单机情况下的一人一单安全问题&#xff0c;但是在集群模式下就不行了。 1、我们将服务启动两份&#xff0c;端口分别为8081和8082&#xff1a; 2、然后修改nginx的conf目录下的nginx.conf文件&#xff0c;配置反向代…

蓝桥杯杯赛之深度优先搜索优化《1.分成互质组》 《 2.小猫爬山》【dfs】【深度搜索剪枝优化】【搜索顺序】

文章目录 思想例题1. 分成互质组题目链接题目描述【解法一】【解法二】 2. 小猫爬山题目链接题目描述输入样例&#xff1a;输出样例&#xff1a;【思路】【WA代码】【AC代码】 思想 本质为两种搜索顺序&#xff1a; 枚举当前元素可以放入哪一组枚举每一组可以放入哪些元素 操…

天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器

在电力行业中&#xff0c;输电线路的安全稳定运行对于保障社会经济活动至关重要。然而&#xff0c;广阔的输电线路常常穿越复杂的地形和恶劣的自然环境&#xff0c;给电力巡检和保护工作带来了巨大挑战。 为了提高巡检效率和响应速度&#xff0c;更好地保障电力设施的安全运行…

鸿蒙OS元服务开发:【(Stage模型)学习窗口沉浸式能力】

一、体验窗口沉浸式能力说明 在看视频、玩游戏等场景下&#xff0c;用户往往希望隐藏状态栏、导航栏等不必要的系统窗口&#xff0c;从而获得更佳的沉浸式体验。此时可以借助窗口沉浸式能力&#xff08;窗口沉浸式能力都是针对应用主窗口而言的&#xff09;&#xff0c;达到预…

聚能共创下一代智能终端操作系统 软通动力荣膺“OpenHarmony优秀贡献单位”

近日&#xff0c;由开放原子开源基金会指导&#xff0c;以“开源共享未来”为主题的OpenHarmony社区年会在北京成功举办。本次活动汇集OpenHarmony项目群共建单位及生态伙伴等多方力量&#xff0c;旨在对2023年度OpenHarmony年度开源事业全面总结的同时&#xff0c;吸引更多伙伴…

HFSS仿真环形耦合器学习笔记

HFSS仿真环形耦合器学习笔记 文章目录 HFSS仿真环形耦合器学习笔记1、 理论基础2、 设计分析3、 仿真验证1、 求解器设置2、 建模3、 激励方式设置4、 边界条件设置5、 扫频设置6、 设计检查&#xff0c;仿真分析7、 数据后处理 1、 理论基础 环形定向耦合器的结构示意图如图所…