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.hqwc.cn/news/596521.html

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

相关文章

用讲故事的方式学Pandas的数据结构之DataFrame

在一个遥远的数据王国里&#xff0c;有一个被称为"DataFrame"的魔法图书馆&#xff0c;这个图书馆非常独特&#xff0c;因为它是由一系列叫做"Series"的魔法书架组成的。每个书架都拥有自己的名字和一串神秘的数字&#xff0c;这些数字是王国里各种知识和秘…

租用阿里云的服务器多少钱?30元、61元、99元、165元、199元

租个阿里云的服务器多少钱&#xff1f;很便宜&#xff0c;云服务器2核2G3M固定带宽99元一年、2核4G服务器30元3个月、199元一年&#xff0c;轻量应用服务器2核2G3M配置61元一年、2核4G4M带宽165元一年&#xff0c;可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券和活动…

ThingsBoard通过MQTT发送遥测数据

MQTT基础 客户端 MQTT连接 遥测上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

图解大型网站多级缓存的分层架构

前言 缓存技术存在于应用场景的方方面面。从浏览器请求&#xff0c;到反向代理服务器&#xff0c;从进程内缓存到分布式缓存&#xff0c;其中缓存策略算法也是层出不穷。 假设一个网站&#xff0c;需要提高性能&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服…

c# wpf LiveCharts 饼图 简单试验

1.概要 c# wpf LiveCharts 饼图 简单试验 2.代码 <Window x:Class"WpfApp3.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

竞赛 交通目标检测-行人车辆检测流量计数 - 竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

数据库不用mmap

你确定你想用 MMAP 实现数据库么&#xff1f;_哔哩哔哩_bilibili MMAP 的随机读与顺序读的性能表现不好&#xff0c;以及对于写主要是不可控的刷入时机以及代码冗余&#xff0c;所以 MMAP 不适合在数据库中使用。 mmap是posix系统调用&#xff0c;它提供由操作系统管理内存映…

谷歌在生成式人工智能领域的挑战与机遇:内部纷争与市场压力下的战略调整

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据生成 | Matlab实现基于DE差分进化算法的数据生成

数据生成 | Matlab实现基于DE差分进化算法的数据生成 目录 数据生成 | Matlab实现基于DE差分进化算法的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于DE差分进化算法的数据生成&#xff0c;运行环境Matlab2021b及以上&#xff1b; 2.计…

Tomcat管理配置

Tomcat管理配置 1 host-manager项目2 manager项目 Tomcat 提供了Web版的管理控制台&#xff0c;位于webapps目录下。Tomcat 提供了用于管理Host的host-manager和用于管理Web应用的manager。 1 host-manager项目 Tomcat启动之后&#xff0c;可以通过 http://localhost:8080/ho…

go | gin 重定向路由重定向

web 重定向 重定向有一点要注意&#xff0c;重定向是在客户端那边执行的&#xff0c;一次服务器只能响应一次请求。但是要注意路由重定向 路由重定向是在服务器内部完成重定向资源请求 package mainimport ("github.com/gin-gonic/gin""fmt" )/* func main…

基于单片机高压输电线路微机保护系统设计

**单片机设计介绍&#xff0c;基于单片机高压输电线路微机保护系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机高压输电线路微机保护系统设计是一个涉及电力系统继电保护的复杂工程。该系统主要利用单片机作为控制核心&…