【STL】C++ queue队列(包含优先级队列) 基本使用

目录

一 queue

1 常见构造

1 空容器构造函数

2. 使用指定容器构造

3 拷贝构造函数

2 empty

3  size

4 front && back

5 push && pop

6 emplace

7 swap

二 优先级队列( priority_queue)

1 常见构造

2 其他操作

3 大堆和小堆

1. 大小堆切换

2 自定义类型比较

三 总结


一 queue

1 常见构造

1 空容器构造函数

构造一个没有元素的空容器。

2. 使用指定容器构造

可以使用指定的底层容器来构造栈,默认是 std::deque,但也可以是 std::vector 或 std::list

3 拷贝构造函数

构造一个容器,其中包含 x 中每个元素的副本,顺序相同

void Test1()
{
	queue<int> q1;
	cout << q1.size() << endl;

	vector<int> v{ 1, 2, 3, 4 };
	queue<int, vector<int>> q2(v);
	cout << q2.size() << endl;

	queue<int> q3(q1);
	cout << q3.size() << endl;
}

2 empty

测试容器是否为空

bool empty() const;
void Test2()
{
	queue<int> q1;
	if (q1.empty()) cout << "q1 is empty" << endl;
	else cout << "q1 is not empty" << endl;
	
	vector<int> v{ 1, 2, 3, 4 };
	queue<int, vector<int>> q2(v);
	if (q2.empty()) cout << "q2 is empty" << endl;
	else cout << "q2 is not empty" << endl;

}

3  size

返回容器大小

上面已经演示过了, 这里不做过多讲解

4 front && back

返回对头元素和队尾元素

value_type& front(); 
const value_type& front() const;

value_type& back(); 
const value_type& back() const;
void Test3()
{
	vector<int> v{ 1, 2, 3, 4 };
	queue<int, vector<int>> q2(v);
	cout << "front: " << q2.front() << endl;
	cout << "back: " << q2.back() << endl;
}

5 push && pop

void push(const value_type& val); 
void push(value_type&& val);
void pop();
void Test4()
{
	queue<int> q;
	for (int i = 0; i < 4; i++)
	{
		q.push(i);
	}

	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	}
}

6 emplace

 作用和 push一样的, 只是效率不一样, 涉及到了右值引用问题, 后面讲

7 swap

void swap (queue& x) noexcept(/*see below*/);

交换两个容器的内容

void Test5()
{
	queue<int> q1, q2;
	for (int i = 0; i < 4; i++)
	{
		q2.push(i);
	}

	q1.swap(q2);
	cout << "q1.size--> " << q1.size() << endl;
	cout << "q2.size--> " << q2.size() << endl;
}

二 优先级队列( priority_queue)

1 常见构造

同queue一样

void Test6()
{
	priority_queue<int> q1;
	cout << q1.size() << endl;

	vector<int> v{ 1, 2, 3, 4 };
	priority_queue<int, vector<int>> q2(v.begin(), v.end());// 这里不同queue
	cout << q2.size() << endl;

	priority_queue<int> q3(q1);
	cout << q3.size() << endl;
}

2 其他操作

同 queue一样, 很简单 

3 大堆和小堆

1. 大小堆切换

#include <vector>
#include <queue>
#include <functional> // greater算法的头文件
void TestPriorityQueue()
{
       // 默认情况下,创建的是大堆,其底层按照小于号比较
       vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };
       priority_queue<int> q1;
       for (auto& e : v)
       {
              q1.push(e);
       }

       while (!q1.empty())
       {
              cout << q1.top() << ' ';
              q1.pop();
       }
       cout << endl;

       // 如果要创建小堆,将第三个模板参数换成greater比较方式
       priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
       while (!q2.empty())
       {
              cout << q2.top() << ' ';
              q2.pop();
       }
}

int main()
{
       TestPriorityQueue();
       return 0;
}

2 自定义类型比较

如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者< 的重载。 

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
	bool operator<(const Date& d)const
	{
		return (_year < d._year) ||
			(_year == d._year && _month < d._month) ||
			(_year == d._year && _month == d._month && _day < d._day);
	}
	bool operator>(const Date& d)const
	{
		return (_year > d._year) ||
			(_year == d._year && _month > d._month) ||
			(_year == d._year && _month == d._month && _day > d._day);
	}
	friend ostream& operator<<(ostream& _cout, const Date& d)
	{
		_cout << d._year << "-" << d._month << "-" << d._day;
		return _cout;
	}
private:
	int _year;
	int _month;
	int _day;
};
void TestPriorityQueue2()
{
	// 大堆,需要用户在自定义类型中提供<的重载
	priority_queue<Date> q1;
	q1.push(Date(2018, 10, 29));
	q1.push(Date(2018, 10, 28));
	q1.push(Date(2018, 10, 30));
	cout << q1.top() << endl;
	// 如果要创建小堆,需要用户提供>的重载
	priority_queue<Date, vector<Date>, greater<Date>> q2;
	q2.push(Date(2018, 10, 29));
	q2.push(Date(2018, 10, 28));
	q2.push(Date(2018, 10, 30));
	cout << q2.top() << endl;
}

三 总结

本节难度不算大, 但是优先级队列涉及到了前面大小堆知识, 对概念不清晰的可以看看我前面的排序章节

昨天游泳了, 今天全身酸痛. 大家一定要做到生活平很, 锻炼纳入到自己学习和工作中. 

前段日子, 不是蓝桥杯嘛, 搞了个省三, 因为学校的一些傻逼操作导致我丧失一个半小时时间, 有一道很难的DFS决策树问题, 测试完毕没问题,可是没时间提交了, 差几秒. 虽然我觉得省三没啥技术含量, 然后学校的傻逼操作对我也是心态打击. 但是感觉老爸挺高兴的, 又发朋友圈又给我发红包的, 我还是很开心, 下次再来吧. 

继续加油

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

961题库 北航计算机 MIPS基础选择题 附答案 选择题形式

有题目和答案&#xff0c;没有解析&#xff0c;不懂的题问大模型即可&#xff0c;无偿分享。 第1组 习题 MIPS处理器五级流水线中&#xff0c;涉及DRAM的是 A. 取指阶段 B. 译码阶段 C. 执行阶段 D. 访存阶段 MIPS处理器五级流水线中&#xff0c;R型指令保存结果的阶段是 A.…

Mixly UDP局域网收发数据

一、开发环境 软件&#xff1a;Mixly 2.0在线版 硬件&#xff1a;ESP32-C3&#xff08;立创实战派&#xff09; 固件&#xff1a;ESP32C3 Generic(UART) 测试工具&#xff1a;NetAssist V5.0.1 二、实现功能 ESP32作为wifi sta连接到路由器&#xff0c;连接成功之后将路由器…

基于Django的博客系统之增加类别导航栏(六)

上一篇&#xff1a;基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能&#xff08;五&#xff09; 下一篇&#xff1a; 功能概述 博客类型导航栏。 需求详细描述 1. 博客类型导航栏 描述&#xff1a; 在博客首页添加类型导航栏&#xff0c;用户可以通过导航…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

vue3-调用API实操-调用开源头像接口

文档部分 这边使用是开源的API 请求地址: &#xff1a;https://api.uomg.com/api/rand.avatar 返回格式 : json/images 请求方式: get/post 请求实例: https://api.uomg.com/api/rand.avatar?sort男&formatjson 请求参数 请求参数说明 名称必填类型说明sort否strin…

探索安全之道 | 企业漏洞管理:从理念到行动

如今&#xff0c;网络安全已经成为了企业管理中不可或缺的一部分&#xff0c;而漏洞管理则是网络安全的重中之重。那么企业应该如何做好漏洞管理呢&#xff1f;不妨从业界标准到企业实践来一探究竟&#xff01;通过对业界标准的深入了解&#xff0c;企业可以建立起完善的漏洞管…

算法每日一题(python,2024.05.28) day.10

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;中等&#xff09; 解题思路&#xff1a; 辅助数组 找规律&#xff0c;设旋转前某点matrix[i][j]&#xff0c;则旋转后改点变为matrix[j][n&#xff0d;1&#xff0d;i]&#xff08;n为len(matr…

LLVM后端__llc中值定义信息的查询方法示例

关于LiveIntervals pass中相关数据结构的含义&#xff0c;在寄存器分配前置分析(5.1) - LiveInterval这篇博客中已经做了清晰的讲解&#xff0c;此处不再赘述&#xff0c;本文主要讲解值定义信息VNInfo的使用方法和注意事项。 1. VNInfo含义 在LLVM的源码中&#xff0c;VNInf…

!力扣 108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按升序排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…

Java——异常

1.什么是异常 将程序执行过程中发生的不正常行为称为异常。 常见的异常有&#xff1a;算数异常&#xff0c;空指针异常&#xff0c;数组越界异常 每一种异常都有对应的类对齐描述 为了对每一种异常进行管理&#xff0c;Java内部实现了一个对异常的体系结构 1. Throwable&#x…

HNCTF2022 REVERSE

[HNCTF 2022 WEEK2]esy_flower 简单花指令 Nop掉 然后整段u c p然后就反汇编 可能反编译的不太对&#xff0c;&#xff0c;看了别人的wp就是ida反编译的有问题 #include<stdio.h> #include<string.h> int main() {int i,j;char ch[]"c~scvdzKCEoDEZ[^roDICU…

Unity协程详解

什么是协程 协程&#xff0c;即Coroutine&#xff08;协同程序&#xff09;&#xff0c;就是开启一段和主程序异步执行的逻辑处理&#xff0c;什么是异步执行&#xff0c;异步执行是指程序的执行并不是按照从上往下执行。如果我们学过c语言&#xff0c;我们应该知道&#xff0…

node-sass和sass-loader安装Error经验

一、问题 当前笔记本环境版本&#xff1a;node-v16.15.1&#xff1b;npm-8.11.0&#xff0c;在面对五年前vue项目的依赖sass-loader8.0.2&#xff0c;node-sass4.14.1的情况下&#xff0c;怎么参考大神们的安装教程&#xff0c;始终存在Error&#xff0c;经过坚持不懈的努力&a…

list的简单模拟实现

文章目录 目录 文章目录 前言 一、使用list时的注意事项 1.list不支持std库中的sort排序 2.去重操作 3.splice拼接 二、list的接口实现 1.源码中的节点 2.源码中的构造函数 3.哨兵位头节点 4.尾插和头插 5.迭代器* 5.1 迭代器中的operator和-- 5.2其他迭代器中的接口 5.3迭代器…

Nginx源码编译安装

Nginx NginxNginx的特点Nginx的使用场景Nginx 有哪些进程 使用源码编译安装Nginx准备工作安装依赖包编译安装Nginx检查、启动、重启、停止 nginx服务配置 Nginx 系统服务方法一&#xff1a;方法二&#xff1a; 访问Nginx页面 升级Nginx准备工作编译安装新版本Nginx验证 Nginx N…

顶底背离的终极猜想和运用

这几天圈内都在传底蓓离什么的。作为严肃的量化自媒体&#xff0c;我们就不跟着吃这波瓜了。不过&#xff0c;我一直很关注技术指标的顶背离和底背离&#xff0c;一直在追问它的成因如何&#xff0c;以及如何预测。 底蓓离把我目光再次吸引到这个领域来&#xff0c;于是突然有…

Kubernetes-使用集群CA证书给用户颁发客户端证书访问Api-Server

一、官网地址 证书和证书签名请求 | Kubernetes 二、Demo 一、创建测试文件夹 cd ~ mkdir add_k8s_user_demo cd add_k8s_user_demo 二、创建符合X509标准的证书 openssl genrsa -out myuser.key 2048 openssl req -new -key myuser.key -out myuser.csr -subj "/CNmy…

【30天精通Prometheus:一站式监控实战指南】第14天:jmx_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

mybatis增删改查模板设置及设置调用

mybatis增删改查模板设置 系统配置文件完成以及连接好数据之后&#xff0c;就可以用这个mybatis了&#xff0c;首先写这个数据库的增删改查模板StashMapper.xml&#xff0c;这个东西是要放在DAO层中的奥&#xff0c;切记。 1.编写mybatis对应数据库的增删改查模板 在我的Sta…

[Qt学习笔记]Qtxlsx在Qt下的配置和调用

背景分析 Qt操作Excel文件一般有QAxObject和QtXlsx两种方法&#xff0c;前者需要调用wps或office组件进行读写操作&#xff0c;具有一定的局限性&#xff0c;下面列出两种方法的优缺点对比 QAxObject&#xff1a; 优点&#xff1a;支持xls和xlsx等版本。office组件读写速度快&…