【C++数据结构与算法】队列

C++队列

队列:queue

API: C++ queue

队列是一种FIFO(先进先出)的数据结构

头文件:# include<queue>

定义一个队列:queue<T> queueName; ,和stack一样,队列也可以包含pair元素

queue<char, list<char>> q1;
queue<int, deque<int>> q2;

基本函数

函数名作用
front()访问第一个元素
back()访问最后一个元素
empty()检查容器是否为空
size()返回元素数
push()尾端插入元素
emplace()【C++11】在尾部原位构造元素(比起push省了复制操作)
pop()移除首位元素
swap()【C++11】交换内容,交换a、b两个队列容器中的内容

经典例题

双端队列:deque

API: C++ deque

std::deque 是有索引的序列容器,允许在首尾两端快速插入和删除元素。(任意端的插入删除操作不会使指向其他元素的指针(or 引用)失效)

特性:①非连续存储 ②索引访问必须进行二次指针解引用 ③存储按需自动扩张&收缩 ④拥有较大的最小内存开销(只保有一个元素的 deque 必须分配它的整个内部数组)

存储方式:典型实现采用一系列单独分配的固定尺寸数组,外加额外的簿记数据

常见操作复杂度:

  • 随机访问——常数 O(1)
  • 在结尾或起始插入或移除元素——常数 O(1)
  • 插入或移除元素——线性 O(n)

成员类型

待补充,在实战中学习

基础函数

带*为C++11新特性

访问与赋值
函数作用失效
assign()将值赋给容器【详见】
at()带越界检查访问指定索引的元素
front()访问第一个元素
back()访问最后一个元素
begin()
*cbegin()
返回指向起始的迭代器
end()
*cend()
返回指向末尾的迭代器
rbegin()
*crbegin()
返回指向起始的逆向迭代器
rend()
*crend()
返回指向末尾的逆向迭代器
容量
函数作用
empty()判空
size()返回元素数
max_size()返回可容纳的最大元素数
shrink_to_fit()释放未使用的内存,减少内存的使用
修改器
函数作用失效
clear()清除内容
insert()插入元素详见
*emplace()原位构造元素(pos, &&args)
erase()擦除元素(参数为迭代器(pos) OR 迭代器begin和end)
push_back()尾端添加元素
*emplace_back()尾端原位构造元素
pop_back()移除尾端元素
push_front()在首端添加元素
*emplace_front()首端原位构造元素
resize()改变存储元素的个数详见
swap()交换内容
详细说明:assign()

使用方式

std::deque<char> characters;// 用法1
void assign(size_type count, const T& value);
characters.assign(5, 'a');  // 容器:a a a a a// 用法2
void assign( InputIt first, InputIt last );
const std::string extra(6, 'b');
characters.assign(extra.begin(), extra.end()); //容器:bbbbbb// 用法3
void assign( std::initializer_list<T> ilist ); // C++11新特性
characters.assign({'C', '+', '+', '1', '1'});  // 容器:C++11
  1. 用count个value副本替换容器中的内容
  2. 以[first, last)中的元素替换(其中有任一实参是指向*this中的迭代器时行为未定义)
  3. 以来自ilist 的元素替换内容。
详细说明:insert()
// 用法1
iterator insert( const_iterator pos, const T& value );
iterator insert( const_iterator pos, T&& value ); //C++11 起// 用法3
iterator insert( const_iterator pos, size_type count, const T& value );// 用法4
iterator insert( const_iterator pos, InputIt first, InputIt last );// 用法5 C++11起
iterator insert( const_iterator pos, initializer_list<T> ilist );
  • 用法1、2:在pos前插入value
  • 用法3:在pos前插入value个count副本
  • 用法4:在 pos 前插入来自范围 [first, last) 的元素。
  • 用法5:在pos前插入ilist元素
详细介绍:resize()

重设容器大小以容纳count个元素

void resize( size_type count );
void resize( size_type count, const value_type& value );

如果deque.size() > count:减少容器到它的前count个元素

如果deque.size() <= count:①追加额外的默认插入元素②追加额外的value的副本

双端例题:LC103 二叉树的锯齿形层序遍历

题目

返回Z字型顺序下,树的节点值数组(层层遍历,从左往右,从右往左,交替)

每层存一个数组,最后返回元素是数组的数组

解答:

class Solution
{
public:vector<vector<int>> zigzagLevelOrder(TreeNode *root){if (!root){return {};}// 使用双端队列deque<TreeNode *> treeq;treeq.push_back(root);// 判断当前,队列从头pop还是从尾popbool lTor = true;vector<vector<int>> answer;while (!treeq.empty()){deque<TreeNode *> temp = treeq;treeq.clear();// 遍历当前层级TreeNode *curnode;// 层级节点值vector<int> levelVec = {};while (!temp.empty()){// 从左至右出,从头出// 子节点从尾端进入,按前序遍历if (lTor){curnode = temp.front();temp.pop_front();levelVec.push_back(curnode->val);if (curnode->left)treeq.push_back(curnode->left);if (curnode->right)treeq.push_back(curnode->right);}else{// 从右至左,从尾出// 子节点从首端进入,后序遍历curnode = temp.back();temp.pop_back();levelVec.push_back(curnode->val);if (curnode->right)treeq.push_front(curnode->right);if (curnode->left)treeq.push_front(curnode->left);}}lTor = !lTor;answer.push_back(levelVec);}return answer;}
};

优先队列:priority_queue

头文件:<queue>

初始化与定义

// elemtype为队列中元素的类型
// what_vector为,存储元素的底层容器是什么
// class_type是一个类,用于比价
std::priority_queue<elem_type, what_vector, class_type> pq;// 创建一个大根堆,默认情况下
std::priority_queue<int> max_heap; 
// 创建一个小根堆
std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap; // 自定义比较器
struct compare{// 需要重载()运算符bool operator()(int a, int b){return a > b;}
};std::priority_queue<int, std::vector<int>, compare> custom_min_heap;

成员函数

  • pop()
  • push()
  • top()
  • front()

【关于优先队列的比较器】

我们可以把堆想象成一个水平横向的会场,最右端为入口(即top)

更尊贵的客人更深入会场,即更靠近会场左端。

而更为尊贵的客人,是在比较器中获得true的那一位。

所以,less重载了operator<,我们获取的却是大根堆,因为更小的元素往里走了。

参考文章

例题:LC264 丑数 II(使用优先队列实现小根堆)

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

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

相关文章

VBA excel 表格将多行拆分成多个表格或 文件 或者合并 多个表格

excel 表格 拆分 合并 拆分工作表按行拆分为工作表工作表按行拆分为工作薄 合并操作步骤 拆分 为了将Excel中的数万行数据拆分成多个个每个固定行数的独立工作表&#xff0c;并且保留每个工作表的表头&#xff0c;你可以使用以下VBA脚本。这个脚本会复制表头到每个新的工作表&…

Java案例:找素数

文章目录 题目问题反思代码改进 题目 找素数 判断101-200之间有多少个素数&#xff0c;并输出所有素数 只需要除到 n/2 即可。 算数平方根。&#xff08;j*j<i&#xff09;实际上可以更高效地只除到Math.sqrt(n)&#xff08;或者说Math.sqrt(n) 1为了处理整数除法&#xf…

Web学习_sqli-labs_1~10关

less1-GET-Error based - Single quotes - String &#xff08;基于错误的GET单引号字符型注入&#xff09; 我每次操作都会在Hackbar中&#xff0c;代码都在Hackbar框中&#xff0c;可放大看 有题目知道了是字符型注入&#xff0c;我们先判断表格有几列&#xff0c;可以发现…

Istio_1.17.8安装

项目背景 按照istio官网的命令一路安装下来&#xff0c;安装好的istio版本为目前的最新版本&#xff0c;1.22.0。而我的k8s集群的版本并不支持istio_1.22的版本&#xff0c;导致ingress-gate网关安装不上&#xff0c;再仔细查看istio的发布文档&#xff0c;如果用istio_1.22版本…

学习分享-声明式的 HTTP 客户端OpenFeign

OpenFeign 详细介绍 最近在学习中有用到OpenFeign&#xff0c;也在网上查找了相关资料&#xff0c;做下分享。 一、概述 OpenFeign 是一个声明式的 HTTP 客户端&#xff0c;它使得调用 REST API 变得更加简单和直观。通过 OpenFeign&#xff0c;开发者只需定义接口并添加注解…

屏幕空间反射技术在AI绘画中的作用

在数字艺术和游戏开发的世界中&#xff0c;真实感渲染一直是追求的圣杯。屏幕空间反射&#xff08;Screen Space Reflection&#xff0c;SSR&#xff09;技术作为一种先进的图形处理手段&#xff0c;它通过在屏幕空间内模拟光线的反射来增强场景的真实感和视觉冲击力。随着人工…

【Docker系列】跨平台 Docker 镜像构建:深入理解`--platform`参数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何知道ZIP压缩包解压密码?有哪些解密策略?

我们在生活当中&#xff0c;经常会遇到ZIP压缩包&#xff0c;它们以其高效的文件压缩和方便的传输特性而受到广泛欢迎。然而&#xff0c;有时我们可能会遇到一些带有密码保护的ZIP文件&#xff0c;这时就需要知道解压密码才能访问其中的内容。本文将探讨如何知道ZIP压缩包的解压…

Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

stm32最小系统焊接调试总结

stm32最小系统打板后,接下来开始焊接元器件,焊接元器件可以参考立创EDA焊接辅助工具。 图1 焊接辅助助手 焊接准备工具有,焊台,放大镜,元器件,镊子,焊锡膏,锡丝及万用表等。调节焊台温度到350-400摄氏度。焊接顺序是先焊接USB typec接口,5V电源,ldo,ch340,stm32芯片…

人工智能小作业

1.问题 将下列句子用一阶谓词形式表示&#xff1a; (1)雪是白的。 (2)数a和数b之和大于数c。 (3)201班的学生每人都有一台笔记本电脑。 2.答案 句子&#xff08;1&#xff09;“雪是白的”可以表示为&#xff1a; White(雪)。 句子&#xff08;2&#xff09;“数a和数b…

【代码审计】star7th/showdoc:v3.2.4 Phar反序列化写webshell

目录 漏洞速览 复现 漏洞速览 微步在线X情报社区-威胁情报查询_威胁分析平台_开放社区 主要就是两步&#xff0c;sql注入拿到用户token&#xff0c;再以用户身份上传恶意phar包打phar反序列化 因为文件上传对用户权限没有限制&#xff0c;故本文对sql注入部分不做探讨。…

C++中的封装,继承和多态

目录 摘要 封装&#xff08;Encapsulation&#xff09; 基础用法 继承&#xff08;Inheritance&#xff09; 基础用法 多态&#xff08;Polymorphism&#xff09; 1. 虚函数 2. 纯虚函数 总结 摘要 在C中&#xff0c;封装、继承和多态是面向对象编程的三大核心特性。…

机器学习--损失函数

损失函数&#xff08;Loss Function&#xff09;&#xff0c;也称为代价函数&#xff08;Cost Function&#xff09;或误差函数&#xff08;Error Function&#xff09;&#xff0c;是机器学习和统计学中的一个重要概念。它用于量化模型预测值与真实值之间的差异。损失函数的值…

怎么换自己手机的ip地址

在互联网时代&#xff0c;IP地址已经成为了我们数字身份的一部分。无论是浏览网页、下载文件还是进行在线交流&#xff0c;我们的IP地址都在默默发挥着作用。然而&#xff0c;有时出于安全或隐私保护的考虑&#xff0c;我们可能需要更换手机的IP地址。那么&#xff0c;如何轻松…

C语言——函数指针

一、函数指针的定义 函数指针是指向函数的指针变量&#xff0c;可以用来动态调用不同的函数。使用函数指针的一般步骤如下&#xff1a; 1、定义函数指针类型&#xff1a;typedef 返回值类型 (*指针变量名)(参数列表); 2、声明函数指针变量并赋值&#xff1a;指针变量名 函数…

深入理解Android多线程开发:场景应用与解决方案解析

前言 在专栏之前的文章中,我们了解了并发、线程、线程安全、线程池等多线程开发的概念。本篇文章,我们来梳理一下在Android开发中我们面临的多线程开发中常见的应用场景和解决方案。 应用场景 资源复用和优化 并发控制与线程池的使用 为了优化资源利用和提高应用性能,需要…

【Spring Boot实现网页会话(Session )】

文章目录 前言什么是网页会话&#xff08;Session&#xff09;Spring Boot 中的 Session 管理Session 的创建与管理Session 的数据存储使用示例 前言 会话管理允许服务器在多次HTTP请求之间保持用户的状态信息&#xff0c;以便用户可以进行认证、保持登录状态等操作。 什么是…

电商系统中热库和冷库的使用与数据转换

在现代电子商务系统中&#xff0c;数据的高效管理和存储是关键。电商平台每日处理海量数据&#xff0c;这些数据不仅包括用户行为、交易记录&#xff0c;还涵盖库存信息、商品详情、物流信息等。为了优化数据存储和查询效率&#xff0c;电商系统通常采用热库&#xff08;Hot St…

C#操作MySQL从入门到精通(14)——汇总数据

前言 我们有时候需要对数据库查询的值进行一些处理,比如求平均值等操作,本文就是详细讲解这些用法,本文测试使用的数据库数据如下: 1、求平均值 求所有student_age 列的平均值 string sql = string.Empty; if (radioButton_AVG.Checked) {sql = “select AVG( student_…