C++ queue类成员介绍

news2025/1/9 18:09:08

目录

🤔queue模板介绍:

🤔queue特点:

🤔queue内存图解:

🤔 queue的成员函数

🔍queue构造函数:

🔍queue赋值函数:

🔍queue判断函数:

🔍queue删除和添加函数:

🤔代码验证:

🤔运行结果:

🤔queue实际应用场景:

🤔结束!


🤔queue模板介绍:

queue(队列)是一种数据结构,它可以在一端插入元素,另一端弹出元素,并且按照元素被放入队列的顺序进行访问。在队列中插入元素的一端叫做队尾(rear),从队列中弹出元素的一端叫做队首(front)。队列的典型应用包括广度优先搜索缓存

在C++ STL中,队列实现为一个模板类,称为queue。它包含以下操作:

📖1. push(x):将元素x插入队列尾部。
📖2. pop():弹出队列头部元素。
📖3. front():返回队列头部元素。
📖4. back():返回队列尾部元素。
📖5. empty():检查队列是否为空。
📖6. size():返回队列中元素的数量。
📖7.emplace(x) :将元素x插入队列尾部。

🤔queue特点:

📖1.不支持迭代器:不可以用下标访问队列。

📖2.插入和删除:只允许从一端新增元素,从另一端移除元素。

📖3.访问操作:只有队头和队尾接受访问,其余数据不可访问。

C++17标准以后,queue模板新增函数emplace;它和push()的作用类似,都是将一个数据压入队尾,但是相比较于push来讲,emplace不需要创建一个临时对象,而是直接在容器内构造一个元素。相对于push()函数,我们需要先创建一个元素对象,然后将其复制到容器中或者移动到容器中,这将导致更多的开销,特别是在元素类型比较大或者包含不可复制/移动的对象时。

另外,emplace的高效性还得益于容器中可能的内部优化。对于某些容器(如vector),如果容器中没有足够的空间来存储新增的元素,容器可能会重新分配一块更大的内存,并将现有元素移动到新的内存中。在这样的情况下,使用emplace函数可以直接在新分配的内存中构造元素,而不需要先构造临时对象,再将其复制到新的内存中,这将节省大量的时间和空间。

当然,需要注意的是,对于某些简单类型的元素(如整数、浮点数等),由于它们的构造和复制开销比较小,因此emplacepush()在执行速度上的差异将比较小。但在任何情况下,使用emplace可以使代码更加简洁和高效。

🤔queue内存图解:

🤔 queue的成员函数

🔍queue构造函数:

📖1.默认构造函数:queue<T>que

queue<int> d;

📖2.拷贝构造函数:queue(const queue &que)       *此处是深拷贝,不共用地址

queue<int>d1(d);

🔍queue赋值函数:

📖1.重载等号运算符:queue &operator =(const queue &que)

queue<int>d2;
d2 = d;

🔍queue判断函数:

📖1.判断队列是否为空:empty()

q.empty();

📖2.返回队的大小:size()

q.size()

📖3.交换两个队列:swap()

d.swap();

🔍queue删除和添加函数:

📖1.向队尾添加元素:push()

d.push(i);

📖2.向队尾添加,任何时候比push更加高效:emplace()

d.emplace(999);

📖3.返回队尾元素:back()

d.back();

📖4.返回队头元素:front()

d.front();

🤔代码验证:

#include<iostream>
 #include<queue>
using namespace std;

void print( queue<int>& q)
{
	cout << endl;
	cout << "队的大小为:";
	cout << q.size()<<endl;
		//利用判断队列是否为空来进行循环
	    while (!q.empty()) {
	        cout << q.front() << " ";
	        q.pop(); // 删除队列头元素
	    }
	    cout << endl;
	cout << "队的大小为:";
	cout << q.size()<<endl;
	cout << endl;
}
void test01()
{
	//默认构造
	queue<int> d;
	for (int i = 0; i < 10; i++)
	{
		d.push(i);
	}
	cout << "默认构造的结果为";
	print(d);

	//因为队列d已经被清空,我们需要再次进行入队操作
	for (int i = 0; i < 10; i++)
	{
		d.push(i);
	}
	//拷贝构造函数(深拷贝)
	queue<int>d1(d);
	cout << "拷贝构造的结果为";
	print(d1);

	//赋值函数
	queue<int>d2;
	d2 = d;
	cout << "赋值函数的结果是:";
	print(d2);

	cout << "d的第一个元素为:";
	cout << d.front() << endl;
	cout << "d的最后一个元素为:";
	cout << d.back();
	//利用emplace添加元素
	d.emplace(999);
	print(d);
}
int main()
{
 test01();
}

🤔运行结果:

 🤔queue实际应用场景:

queue 模板常用于以下情况:

📖1. 宽度优先搜索:在算法中,queue 是广度优先搜索 (BFS) 的核心数据结构,用于存储待处理的节点和处理顺序。BFS 算法在社交网络、推荐系统、游戏 AI 等许多应用中都有着广泛的应用。

📖2. 消息队列:在计算机中,队列是消息传递系统的核心数据结构之一,用于在进程之间传输数据。常见的例子包括消息队列和事件循环系统。

📖3. 带有限制大小的缓存:在某些场景下,我们需要维护一个带有限制大小的缓存,当缓存满时,需要删除一些早期添加的数据。queue 模板提供了此类场景的完美解决方案

📖4. 多线程队列:在多线程编程中,queue 模板也被广泛使用,它可以用于协调不同线程之间的工作。比如,一个线程负责生产数据,将其压入队列中,另一个线程负责消费队列中的数据。通常,在多线程环境中使用 queue 模板需要使用线程安全的数据结构,例如 std::mutex 原子操作等。

📖综上所述,queue 模板作为一种线性数据结构,具有广泛的应用场景,特别是在需要按照先进先出 (FIFO) 或者后进先出 (LIFO) 条件访问数据的情况下。

🤔结束!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马Redis视频教程实战篇(三)

目录 一、优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒杀-一人一单 1.8 集群环境下的并发问题 二、分布式锁 2.1 基本原理和实现方式对比 2.2 Redis分布…

js常见面试笔试题

一.js实现距离最近的回文数 给定一个整数 n &#xff0c;你需要找到与它最近的回文数&#xff08;不包括自身&#xff09;。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输入: "123" 输出: "121" function findNearestPalindrome…

Jenkins+Python自动化测试之持续集成详细教程

前言 今天呢笔者想和大家来聊聊JenkinsPython自动化测试持续集成&#xff0c;废话呢就不多说了哟咱们直接进入主题哟。 一、Jenkins安装 ​ Jenkins是一个开源的软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供…

I.MX RT1170加密启动详解(2):Authenticated HAB认证原理

文章目录 1 基础2 使能过程3 Boot flow 1 基础 HAB认证是基于RSA或ECDSA算法的公钥密码学&#xff0c;它用一系列的私钥对image进行加密&#xff0c;然后BootROM在上电后用对应的公钥验证加密的镜像是否被修改。这个密钥结构就是PKI(Public Key Infrastructure)树 (1)normal …

chatgpt赋能python:Python中画笔颜色的函数介绍

Python中画笔颜色的函数介绍 在Python中&#xff0c;我们可以使用turtle模块来绘制图形&#xff0c;其中画笔颜色是非常重要的一部分。画笔颜色可以决定图形的风格和色调&#xff0c;是图形表现的关键因素之一。Python中提供了几种方法来设置画笔颜色。 1. 设置画笔颜色的函数…

ENU、EPSG坐标系科普(三维重建)

ENU和EPSG实际上代表了两个不同的概念&#xff0c;这两者并不是直接对比的。 1. ENU坐标系&#xff1a;ENU坐标系是一种本地切面坐标系&#xff0c;用于表示与地理位置相关的空间数据。在ENU坐标系中&#xff0c;E代表东&#xff08;East&#xff09;&#xff0c;N代表北&…

RabbittMQ快速实战和集群架构

介绍对比: Kafka&#xff1a;topic不能太多&#xff0c;一个缺点&#xff0c;影响Kafka的吞吐量 集群搭建&#xff1a;【单个也是一个集群&#xff08;特殊&#xff09;】 集群搭建&#xff1a;https://blog.csdn.net/p393975269/article/details/129830252 1&#xff1a;默认…

【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结 一、前言 在之前的STM32的中断系统理论基础知识之基本原理及NVIC中&#xff0c;分别中断的基本原理&#xff0c;中断的管理机制和中断的处理流程进行了较为详细的论述&…

SOLIDWORKS钣金成形工具

SOLIDWORKS钣金成形工具主要用来创建使用冲制或压印制作的钣金特征。成形工具的工作原理是&#xff1a;几何体代表冲制或压印形成的凹陷区域&#xff0c;停止面是指工具要被应用到的钣金面&#xff0c;也可以定义移除面&#xff0c;若定义了移除面&#xff0c;则该面会形成通孔…

模拟人生打开显示找不到msvcp120.dll如何修复?msvcp120.dll是什么呢?

如果您在打开模拟人生游戏时遇到了msvcp120.dll文件丢失的错误信息&#xff0c;这可能是由于缺少Microsoft Visual C Redistributable for Visual Studio 2013软件包导致的。遇到这个情况不需要着急&#xff0c;只需要修复一下就可以。msvcp120.dll如何修复&#xff1f;下面就把…

黑马Redis视频教程实战篇(二)

目录 一、什么是缓存&#xff1f; 1.1 为什么要使用缓存&#xff1f; 1.2 如何使用缓存&#xff1f; 二、添加商户缓存 2.1 缓存模型和思路 2.2 代码实现 三、缓存更新策略 2.1 数据库缓存不一致解决方案 2.2 数据库和缓存不一致采用什么方案 四、实现商铺和缓存与数…

SAP-MM发票校验过账到总账

一&#xff0e;概念 SAP的MIRO发票校验&#xff0c;通常是参照采购订单&#xff08;PO&#xff09;生成&#xff0c;但有时会收到无PO参考的发票&#xff0c;例如供应商的运费、质检费等&#xff0c;这些不想过帐到发票项目的物料或成本科目&#xff0c;那么可以过帐到某个总账…

kong网关启用jwt认证插件

认证流程&#xff1a; 1、创建一个用户 2、生成jwt的所需要的key和密钥 3、在https://jwt.io/的生成jwt token 4、启用jwt插件 5、发送请求的时候携带jwt的token信息 官方指导&#xff1a;https://docs.konghq.com/hub/kong-inc/jwt/configuration/examples/ 一、创建一个新的…

深蓝学院C++基础笔记 第 0 章 C++介绍

一、什么是C 1、c 是一门比较流行的编程语言 \qquad ●https://www.tiobe.com/tiobe-index/2、c是C 语言的扩展 ● 更加关注性能 \qquad ● 与底层硬件紧密结合 \qquad \qquad java和python等语相对来说更加关注易用性。 \qquad ● 对象生命周期的精确控制 \qquad \qqua…

冒泡排序小练习(接收键盘录入、拆分、转整、冒泡递减排序、输出)

接收键盘录入(含输入字符串排错)字符串&#xff0c;拆分、转整、冒泡排序(递减)输出。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址…

unity3d 中场景不显示了

应该是把Layers下面的Nothing打开了

Java学习路线(18)——File、递归、字符集和IO流(上)

一、文件 &#xff08;1&#xff09;概述 File类在java.io.File下&#xff0c;代表操作系统的文件对象&#xff08;文件、文件夹&#xff09;File类提供诸如&#xff1a;定位文件&#xff0c;获取文件信息&#xff0c;删除文件&#xff0c;创建文件等操作 &#xff08;2&…

大数据Doris(三十):Broker Load导入HDFS数据时进行数据过滤

文章目录 Broker Load导入HDFS数据时进行数据过滤 一、创建Doris表 二、准备HDFS数据

使用Axios前后端交互(超详细)建议点赞收藏

1、安装axios 将目录切换到当前项目目录下&#xff0c;执行下面安装命令&#xff1a; npm install --save axios vue-axios 2、将axios挂载到vue实例上或则直接导入组件中 在mian.js中做如下配置&#xff0c;可将axios挂载到vue实例上&#xff1a; import axios from axios…

HNU-电子测试平台与工具2-基于485总线的评分系统

基于485总线的评分系统实验报告 计科210X wolf 202108010XXX 同组成员:wolf、DragonKing、Eliak 验收分数:90 1 实验项目 1.1 项目名称 基于485总线的评分系统 1.2 实验目的 通过本案例加深理解RS485通信方式,实现上位机的主控制器与所有的下位机进行通信。 1.3 实…