STL(五)(queue篇)

news2024/11/19 15:40:12
  • 我发现之前一版在电脑上看 常用函数部分 没有问题,由于是手打上去的,在手机上看会发生错位问题,现已将电脑原版 常用函数部分 截图改为图片形式,不会再发生错位问题,非常感谢大家的支持

  • ### priority_queue优先队列出现频率非常高,尤为重要(是一定要掌握的数据结构)

1.queue队列

  • queue是一种先进先出(FIFO)的数据结构
  • queue提供了一组函数来操作和访问元素,但它的功能相对较简单

queue的定义和结构如下: 

template <class T, class Container = deque<T>>
class queue;
  • T:表示存储在queue中的元素的类型。
  • Container:表示底层容器的类型,默认为deque,也可以使用其他容器类型,如list
  • queue的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素

以下是一些queue的常用函数:

### 这就像一个队伍
           ———————————————————————
pop出去 < ——  1  2  3  4  5  6  < —— push进来
           ———————————————————————

2.priority_queue优先序列

  • priority_queue与普通的队列不同,priority_queue中的元素是按照一定的优先级进行排序的
  • 默认情况下,priority_queue按照元素的值的从大到小进行排序,即最大元素位于队列的前面

priority_queue的定义和结构如下:

template <class T,Container=vector<T>,
          class Compare=less<typename Container::value_type>>
class priority_queue;
  • T:表示存储在priority queue中的元素的类型
  • Container:表示底层容器的类型,默认为vector,也可以使用其他容器类型,如deque
  • Compare:表示元素之间的比较函数对象的类型,默认为less即按照元素的值进行比较
  • priority_queue的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素

以下是一些priority_queue的常用函数:


### 介绍几种优先队列修改比较函数的方法

1.第一种

#include<bits/stdc++.h>
struct Compare{ //仿函数
	bool operator()(int a,int b){ //()重载 
		//自定义比较函数
		return a>b; //小根堆 
	}
};
int main(){
	std::priority_queue<int,std::vector<int>,Compare> pq;
	return 0;
}
  • 默认的是大根堆

2. 第二种

#include<bits/stdc++.h>
auto compare=[](int a,int b){
	//自定义比较函数,按照逆序排列
	return a>b; 
};
int main(){
	std::priority_queue<int,std::vector<int>,decltype(compare)>pq(compare);
	return 0;
}
  •  ### 如果优先队列中的元素类型比较简单,可以直接使用greater<T>来修改比较方法
  • priority_queue<int,vector<int>,greaterr<int>> pq;
    //std::greater函数对象定义在<functional>头文件中

    3.deque双端队列

  •  deque(双端队列)是一种容器,它允许在两端进行高效的插入和删除操作
  • deque是由一系列连续的存储块(缓冲区)组成的,每个存储块都存储了多个元素
  • 这使得deque能够在两端进行快速的插入和删除操作,而不需要移动其他元素

deque的定义和结构如下:

template <class T,class Allocator=allocator<T>>
class deque;
  • T:表示存储在deaue中的元素的类型
  • Allocator:表示用于分配内存的分配器类型,默认为allocator,deque的内部实现使用了一系列的存储块(缓冲区),每个存储块存储了多个元素,并且通过指针进行连接
  • 这种设计使得在两端进行插入和删除操作的时间复杂度为常数时间,即0(1)

###        “单调队列”将使用双端队列来实现(单纯考察双端队列的并不常见)

以下是一些deque的函数:

  • ### 10~12个并不常见 

4.例题讲解:

题号:lanqiao OJ 1113 

1.CLZ银行问题

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int m;
	cin>>m;
	queue<string> V,N;
	while(m--){
		string op;
		cin>>op;
    //判断是否为来到窗口
    //IN情况,推入name
		if(op=="IN") {
			string name,q;
			cin>>name>>q;
			if(q=="V"){
				V.push(name);
			}
			else{
				N.push(name);
			} 
		}
    //out情况,弹出name
		else{
			string q;
			cin>>q;
			if(q=="V"){
				V.pop();
			}
			else{
				N.pop();
			}
		} 
	}
	//输出VIP窗口name
	while(V.size()){
		cout<<V.front()<<"\n"; 
		V.pop();
	} 
	//输出普通窗口name
	while(N.size()){
		cout<<N.front()<<"\n"; 
		N.pop();
	} 
	return 0;
}
  •  每次都会弹出,队列虽然是一种线性结构但它是不能遍历的

题号:lanqiao OJ 741

2.合并果子

  • ### 这里用到一点点贪心
  • 1.先将1和2合并就消耗了3点体力,再将3和9合并就消耗了12点体力,共消耗15点体力
  • 2.先将2和9合并就消耗了11点体力,再将1和11合并就消耗了12点体力,共消耗23点体力
  • 方案1更省体力
  • 那么思路就是每次找到一大堆数字中拿出来最小的两个求和,再放回去(使用优先队列)
  • ### 这道题注意要开long long(int大概是2e9可能会超范围)
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin>>n; //这里直接用队列就好了,没必要再存数组里 
	priority_queue<ll,vector<ll>,greater<ll>> pq; //类型比较简单,默认是大根堆,要的是小根堆把less直接改成greater
	for(int i=1;i<=n;++i){
		ll x;
		cin>>x;
		pq.push(x);
	} 
	
	ll ans=0;
	while(pq.size()>=2){
		//这里pop出来两个最小的数,也就是小根堆顶部的两个数 
		ll x=pq.top();
		pq.pop();
		ll y=pq.top();
		pq.pop();
		ans+=x+y; //求和
		pq.push(x+y); //把最小数的和push回去 
	} 
	cout<<ans<<"\n"; 
	return 0;
}

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

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

相关文章

vmware虚拟机17 安装macos14过程及问题处理亲测

前期准备 1、可引导可虚拟机安装的macOS Sonoma 14 ISO镜像安装文件 我找到得地址&#xff0c;下载自行解决啦 2、VMware虚拟机应用软件 官网下载就好&#xff0c;搜个码搞定 3、解锁工具macOS Unlocker 开始安装&#xff1a; 1、打开VMware软件&#xff0c;新建一个系统…

[MySQL] MySQL复合查询(多表查询、子查询)

前面我们学习了MySQL简单的单表查询。但是我们发现&#xff0c;在很多情况下单表查询并不能很好的满足我们的查询需求。本篇文章会重点讲解MySQL中的多表查询、子查询和一些复杂查询。希望本篇文章会对你有所帮助。 文章目录 一、基本查询回顾 二、多表查询 2、1 笛卡尔积 2、2…

【Vulnhub 靶场】【Funbox: GaoKao】【简单】【20210606】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/funbox-gaokao,707/ 靶场下载&#xff1a;https://download.vulnhub.com/funbox/FunboxGaoKao.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月06日 文件大小&#xff1a;1.3 GB 靶场作者&#…

虚拟化之指令的Trap和仿真

有时,虚拟机监控程序需要在虚拟机(VM)中模拟操作。例如,VM内的软件可能尝试配置与功耗管理或缓存一致性相关的低级处理器控件。通常,您不希望将VM直接访问这些控件,因为它们可能被用于突破隔离,或影响系统中的其他VM。 trap在执行给定操作(例如读取寄存器)时引发异常…

Python零基础入门之详解sort排序使用

文章目录 1.前言2.环境准备3.程序实现4.sort拓展关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 1.前言 昨天一…

IBL环境贴图原理及着色器实现【基于图像的照明】

IBL - Image Based Lighting - 也就是基于图像的照明&#xff0c;是一组照亮物体的技术&#xff0c;不是像上一章那样通过直接分析光&#xff0c;而是将周围环境视为一个大光源。 这通常是通过操作立方体贴图环境贴图&#xff08;取自现实世界或从 3D 场景生成&#xff09;来完…

vuepress-----13、分割config

13、分割config config.js const headConfig require(./config/headConfig); const pluginsConfig require(./config/pluginsConfig); const themeConfig require(./config/themeConfig)module.exports {title: "小邵子",description: 小邵子的个人笔记,head: he…

openEuler JDK21 部署 Zookeeper 集群

zookeeper-jdk21 操作系统&#xff1a;openEuler JDK&#xff1a;21 主机名IP地址spark01192.168.171.101spark02192.168.171.102spark03192.168.171.103 安装 1. 升级内核和软件 yum -y update2. 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make \zl…

tomcat篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、Tomcat的缺省端口是多少,怎么修改?二、tomcat 有哪几种Connector 运行模式(优化)?三、Tomcat有几种部署方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文…

04数据平台Flume

Flume 功能 Flume主要作用&#xff0c;就是实时读取服务器本地磁盘数据&#xff0c;将数据写入到 HDFS。 Flume是 Cloudera提供的高可用&#xff0c;高可靠性&#xff0c;分布式的海量日志采集、聚合和传输的系统工具。 Flume 架构 Flume组成架构如下图所示&#xff1a; A…

重要功能:妙手ERP正式接入北俄海外仓,助力跨境卖家出海俄罗斯市场!

近日&#xff0c;妙手ERP正式接入北俄海外仓&#xff0c;并支持Ozon、速卖通AliExpress、Joom平台卖家同步推送商品、查看库存清单、高效处理订单&#xff0c;助力卖家掘金俄罗斯市场。 关于北俄海外仓 北俄海外仓为北俄国际旗下项目&#xff0c;北俄国际成立于2008年&#xf…

【Java用法】Lombok中@SneakyThrows注解的使用方法和作用

Lombok中SneakyThrows注解的使用方法和作用 一、SneakyThrows的作用二、SneakyThrows注解原理 一、SneakyThrows的作用 普通Exception类,也就是我们常说的受检异常或者Checked Exception会强制要求抛出它的方法声明throws&#xff0c;调用者必须显示的去处理这个异常。设计的目…

企业集团采购系统(供应商、询价、招投标)-源码

一、业务需求 企业招标询价供应商管理系统是一种专业的采购管理系统&#xff0c;旨在帮助企业实现供应商关系的管理和采购成本的控制。该系统涵盖了企业采购管理的各个方面&#xff0c;包括采购预算、供应商管理、产品管理、采购计划、询价、竞价、招标、采购订单、采购合同执…

Docker构建自定义镜像

创建一个docker-demo的文件夹,放入需要构建的文件 主要是配置Dockerfile文件 第一种配置方法 # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量&#xff0c;JDK的安装目录 ENV JAVA_DIR/usr/local# 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

一、仅需实现在线预览&#xff0c;且文件地址公网可访问 &#xff08;一&#xff09;微软office免费预览&#xff08;推荐&#xff09; 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…

使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s

1&#xff0c;演示视频地址 https://www.bilibili.com/video/BV1Hu4y1L7BH/ 使用autodl服务器&#xff0c;两个3090显卡上运行&#xff0c; Yi-34B-Chat-int4模型&#xff0c;用vllm优化&#xff0c;增加 --num-gpu 2&#xff0c;速度23 words/s 2&#xff0c;使用3090显卡 和…

JavaScript中的构造函数是什么,如何使用ES6中的类来进行构造函数的封装和继承?

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习讲解&#xff1a; 深入对象 创建对象三种方式 构造函数 练习 实例化执行过程 说明&#xff1a;1. 创建新对象2. 构造函数this指向新对象3. 执行构造函数代码&#xff0c;修改this&#xff…

微信小程序调用相机拍摄或手机相册

wx.chooseMedia(Object object) 功能描述 拍摄或从手机相册中选择图片或视频。

Docker网络原理

Docker网络概述 1.桥接模式介绍 bridge模式是docker的默认网络模式。 桥接模式是一种用于连接两个不同网络段的设备&#xff0c;使它们能够共享通信的一种方式。 桥接设备工作在OSI模型的第二层&#xff0c;即数据链路层&#xff0c;通常基于MAC地址进行帧转发。 物理层连接…

VUE+THREE.JS 点击模型相机缓入查看模型相关信息

点击模型相机缓入查看模型相关信息 1.引入2.初始化CSS3DRenderer3.animate 加入一直执行渲染4.点击事件4.1 初始化renderer时加入监听事件4.2 触发点击事件 5. 关键代码分析5.1 移除模型5.2 创建模型上方的弹框5.3 相机缓入动画5.4 动画执行 1.引入 引入模型所要呈现的3DSprite…