【STL】队列(queue)

队列

queue没有迭代器

Queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。Queue不提供遍历功能,也不提供迭代器。

头文件:

#include <queue>
queue<T> queT;//queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数
queue& operator=(const queue &que);//重载等号操作符
函数名功能
.push()入队
.pop()出队
.front()返回队首
.back()返回队尾
.empty()判断队列是否为空(为空返回true)
.size()返回队列的大小

实例:

#include<bits/stdc++.h>
using namespace std;
int main()
{   int e,n,m;queue<int> q1;for(int i=0;i<10;i++)      q1.push(i);if(!q1.empty())    cout<<"dui lie  bu kong\n";n=q1.size();cout<<n<<endl;m=q1.back();cout<<m<<endl;for(int j=0;j<n;j++){  e=q1.front();cout<<e<<" ";q1.pop();}cout<<endl;if(q1.empty())    cout<<"dui lie  kong\n";n=q1.size(); cout<<"q1.zsize is "<<n<<endl;system("PAUSE");return 0;
}

优先队列

在C++的标准模板库(STL)中,优先队列(Priority Queue)是一种特殊的队列,它允许元素按照某种优先级进行排序和出队,其底层是用堆来进行实现的。优先队列在许多高级算法和系统设计中都有应用,如在调度算法和路径查找算法中。与普通队列不同,优先队列的元素出队顺序是基于优先级,而非插入顺序。功能相当于构建了一个大顶堆(由队头到队尾为降序排列)或小顶堆(默认为这个)(由队头到队尾为升序排列)。

优先队列的定义

priority_queue<Type, Container, Functional> name;
//Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

优先队列的基本操作

  • 插入元素(push):将一个元素添加到优先队列中,元素将根据其优先级排序。
  • 移除元素(pop):移除优先级最高的元素。
  • 访问顶部元素(top):返回优先级最高的元素而不移除它。
  • 大小(size):返回优先队列中的元素数量。
  • 检查空状态(empty):判断优先队列是否为空。

优先队列的应用场景

  • 任务调度:在操作系统中,优先队列用来管理具有不同优先级的任务。
  • 路径查找算法:如Dijkstra和A*算法中,优先队列用来选择下一个最优的节点。
  • 数据流的管理:如在实时计算或网络通信中管理数据包,确保高优先级的数据先被处理。

实例:

priority_queue<int> q;    //等于priority_queue<int,vector<int>,less<int>> q;
q.emplace(6);
q.emplace(1);
q.emplace(3);
q.emplace(2);
q.emplace(4);
q.emplace(5);
while (!q.empty())
{cout << q.top() << endl;    //队头元素开始 顺序为654321q.pop();
}

priority_queue<int, vector<int>, greater<int>> q; //如果greater为less的话则为654321
q.emplace(6);
q.emplace(1);
q.emplace(3);
q.emplace(2);
q.emplace(4);
q.emplace(5);
while (!q.empty())
{cout << q.top() << endl;    //队头元素开始 顺序为123456q.pop();
}

只能通过top()函数来访问队首元素,也就是优先级最高的元素.

#include<bits/stdc++.h>
using namespace std;
struct node {int id;float x;
};bool operator >=(const node& a, const node& b) { if (a.id!=b.id){return a.id >= b.id;}else{return a.x >= b.x;}
}int main()
{priority_queue<node, vector<node>,greater_equal<node>> q;vector<node> vecNode;vecNode.push_back({ 2,-0.2f });vecNode.push_back({ 1,-0.1f });vecNode.push_back({ 4,-0.4f });vecNode.push_back({ 3,-0.3f });vecNode.push_back({ 3,-0.5f });vecNode.push_back({ -1,-0.5f });for (int i = 0; i < vecNode.size(); i++){cout << vecNode[i].id << " " << vecNode[i].x << endl;//2 -0.2//1 -0.1//4 -0.4//3 -0.3//3 -0.5//-1 -0.5q.push(vecNode[i]);}cout << "aaa" << endl;while (!q.empty()){cout << q.top().id << " " << q.top().x << endl;//-1 -0.5//1 -0.1//2 -0.2//3 -0.5//3 -0.3//4 -0.4q.pop();}
}

结构体的优先级设置

举一个水果的例子

#方法一:通过友元函数重载小于号(第一种定义方式定义优先队列)

#include <iostream>
#include <queue>
using namespace std;
struct fruit
{string name;int price;friend bool operator < (fruit f1,fruit f2){return f1.price>f2.price;}
};
int main()
{priority_queue<fruit> q;fruit f[]={"桃子",3,"梨子",4,"苹果",1,"杏子",2};for(int i=0;i<=3;i++)q.push(f[i]);cout<<q.top().name<<" "<<q.top().price<<endl; return 0;
}

#方法二:cmp函数实现(第二种定义方式定义优先队列)

#include <iostream>
#include <queue>
using namespace std;
struct fruit
{string name;int price;
};
struct cmp
{bool operator () (fruit f1,fruit f2) {return  f1.price>f2.price;}
};
int main()
{priority_queue<fruit,vector<fruit>,cmp> q;fruit f[]={"桃子",3,"梨子",4,"苹果",1,"杏子",2};for(int i=0;i<=3;i++)q.push(f[i]);cout<<q.top().name<<" "<<q.top().price<<endl; return 0;
}

双端队列

在C++的标准模板库(STL)中,双端队列(Deque,全称“double-ended queue”)是一种具有队列和栈性质的复合型容器适配器。它允许在两端快速插入和删除,同时保持随机访问的能力。

双端队列的基本概念
双端队列结合了栈和队列的特点,可以在两端进行元素的插入和删除操作。这种双向操作的灵活性使得双端队列在多种场景中都非常有用。

双端队列的基本操作

  • push_back:在双端队列的末尾添加一个元素。
  • push_front:在双端队列的开头添加一个元素。
  • pop_back:移除双端队列末尾的元素。
  • pop_front:移除双端队列开头的元素。
  • back:访问双端队列末尾的元素。
  • front:访问双端队列开头的元素。
  • at(index):访问指定位置的元素。
  • size:返回双端队列中的元素数量。
  • empty:判断双端队列是否为空。

双端队列的应用场景

  • 滑动窗口算法:在需要快速访问窗口两端数据的算法中,双端队列可以提供有效的支持。
  • 撤销操作:在具有撤销功能的应用程序中,双端队列可以用来存储操作历史,方便进行前进和后退操作。
  • 阻塞队列:在多线程编程中,双端队列可以作为生产者-消费者模型的基础数据结构。

参考博文:

https://blog.csdn.net/m0_57026473/article/details/119345340

https://blog.csdn.net/tang7mj/article/details/135248128

https://blog.csdn.net/weixin_43736974/article/details/87202381

https://blog.csdn.net/hoppingg/article/details/130143286

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

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

相关文章

Docker部署minio集群

1.基本定义 由于是非常轻量级的软件&#xff0c;所以架构上也没有这么复杂&#xff0c;他使用操作系统的文件系统作为存储介质&#xff0c;我们在向任意节点写数据的时候&#xff0c;minio会自动同步数据到另外的节点&#xff0c;而机制叫做erasure code&#xff08;纠删码&am…

Java基础知识总结(48)

&#xff08;1&#xff09;super关键字 1. super代表父类对象 2. 在构造器中访问父类的构造器&#xff08;创建子类对象时会先创建父类对象&#xff09; 3. super访问父类的实例变量 4. 访问父类的实例方法 如&#xff1a;/*** 父类* author Ray**/public class Animal {String…

linux内核驱动-在内核代码里添加设备结点

linux中&#xff0c;一切皆文件 我们在用户层用一些系统函数&#xff08;如&#xff1a;fopen等等&#xff09;时&#xff0c;会进入内核&#xff0c;内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的&#xff08;驱动&#xff09;函数 我们在前面已经…

【滑动窗口】无重复字符的最长字串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度 示例 1: 输入: s "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: s "bbbbb"输出: 1解释: 因为无重复字…

day54 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含手续费

题目1&#xff1a;309 买卖股票的最佳时机含冷冻期 题目链接&#xff1a;309 买卖股票的最佳时机含冷冻期 题意 整数数组prices中prices[i]表示第i天的股票价格&#xff0c;可以进行多次交易&#xff0c;但是在卖出股票后&#xff0c;无法在第二天买入股票&#xff08;冷冻期…

设计模式(017)行为型之责任链模式

责任链模式&#xff0c;它允许你将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求为止。在责任链模式中&#xff0c;有三个核心角色&#xff1a;请求者&#xff08;Client&#xff09;、处理者&#xff08;Handler&#xff09;、以及具体处理者&#xff08;C…

RuoYi-Vue若依框架-vue前端给对象添加字段

处理两个字段的时候有需求都要显示在下拉框的同一行&#xff0c;这里有两种解决方案&#xff0c;一是后端在实体类添加一个对象&#xff0c;加注解数据库忽略处理&#xff0c;在接口处拼接并传给前端&#xff0c;二是在前端获取的数据数组内为每个对象都添加一个字段&#xff0…

cannal的使用

搭建MySQL 安装canal 1.新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml instance.properties ################################################# ## mysql serverId , v1.0.26 will autoGen # canal.instance.mysql.slaveId0# enable g…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

Linux从入门到精通 --- 1.初始Linux

文章目录 第一章&#xff1a;1.1 Linux的诞生1.2 Linux系统内核1.3 Linux系统发行版 第一章&#xff1a; 1.1 Linux的诞生 1991年由林纳斯 托瓦兹创立并发展至今称为服务器操作系统领域的核心系统。 1.2 Linux系统内核 Linux内核提供了系统的主要功能&#xff0c;甚至是开源…

最大公约数算法详解

一、引言 最大公约数&#xff08;Greatest Common Divisor&#xff0c;GCD&#xff09;是数学中一个非常重要的概念。在计算机科学中&#xff0c;求解最大公约数不仅是数学问题的实际应用&#xff0c;也是算法设计的基本技能之一。本文将详细介绍几种常见的求解最大公约数的算…

【JS】判断双层数组中每一项是否都不为空

需求 判断双层数组中每一项是否都不为空&#xff0c;都不为空返回true&#xff0c;否则返回false 数组格式&#xff1a; arr1 [{list: [12, 25, 7, 18, 55]},{list: [36, 9]} ] arr2 [{list: [12, , 7, , 55]},{list: [36, 9]} ]实现 export function checkEmpty(arr) {le…

坚持十天做完Python入门编程100题第三天

坚持十天做完Python入门编程100题第三天 第15题 依次输出列表的元素和下标第16题 编写加速度函数第17题 编写函数计算球的体积第18题 函数默认值参数第19题 全局变量第20题 局部变量第21题 字符串格式化第22题 字符串格式化&#xff08;二&#xff09;第23题 字符串分隔 第15题…

SQL注入sqli_labs靶场第五、六题

第五题 根据报错信息&#xff0c;判断为单引号注入 没有发现回显点 方法&#xff1a;布尔盲注&#xff08;太耗时&#xff0c;不推荐使用&#xff09; 1&#xff09;猜解数据库名字&#xff1a;&#xff08;所有ASCII码值范围&#xff1a;0~127&#xff09; ?id1 and length…

TDengine too many open files

too many open files 是比较常见的报错&#xff0c;尤其使用TDengine 3.0 集群时&#xff0c;大概率会遇到。这个报错很简单&#xff0c;但要想顺利解决&#xff0c;却涉及到很多知识点。 目录 知识点&#xff1a;fs.nr_open知识点&#xff1a;file-max & fs.file-nr知识点…

stl set 的 insert()

set 跟 map 容器很像&#xff0c;但它俩又有很大的不同&#xff0c;它们的底层实现都是树&#xff0c;元素都是有序的&#xff0c;但map是可以修改元素的&#xff0c;而 set 就不行了&#xff0c;set 里的元素只有删除的情况&#xff0c;没有修改的情况&#xff1b;所以发现没有…

客户关系处理成功秘籍

目录 绪论: 第一章:客户关系管理概述 1.1 客户关系管理简介 1.2 客户关系管理的重要性 1.3 CRM的目标和原则 1.4 本章小结 第二章:建立客户数据库 2.1 客户数据库的重要性 2.2 建立客户数据库的步骤 2.3 数据库管理系统(DBMS) 2.4 数据分析工具 2.5 数据库安全…

数据治理(二)-基线治理

本文只是大概讲&#xff0c;基线任务治理方法&#xff0c;分为从基线owner和节点owner角度讲述分为两个部分&#xff1a; 1.基线治理(从基线Owner角度) Owner离职/转岗。 基线配置不合理。 高频预警/破线治理。 应急不及时治理。 2.基线任务治理(从节点Onwer) 2.1模型治…

Linux多进程通信(4)——消息队列从入门到实战!

Linux多进程通信总结——进程间通信看这一篇足够啦&#xff01; 1.基本介绍 1&#xff09;消息队列的本质其实是一个内核提供的链表&#xff0c;内核基于这个链表&#xff0c;实现了一个数据结构&#xff0c;向消息队列中写数据&#xff0c;实际上是向这个数据结构中插入一个…