在priority_queue下对容器、容器适配器的理解和实现

⚡【C++要笑着学】(23) 栈和队列类:stack | queue | 优先级队列 priority_queue | 双端队列 deque 学完栈和队列后,以后我们再需要用栈和队列的地方我们就不用自己去实现了,直接用就行。它们是通过容器适配器去实现的,本章我们先去学习如何去使用它们。此外我们还要讲解优先级队列 priority_queue 和双端队列 deque,deque 我们下一章实现 stack 和 queue 的时候会用到,所以放在这一章先讲解一下,至于 deque 涉及到的 "仿函数" 概念我们会再下一章讲实现的时候重点讲解!...... 阅读详情

原文地址:https://blog.youkuaiyun.com/qq_42837885/article/details/99566524

priority_queue

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
注意:

  1. 默认情况下priority_queue是大堆。

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

  3. 有些情况下,用户可能需要提供比较器规则

class Less 
{ 
public:    
	bool operator()(const Date* pLeft, const Date* pRight)    
	{        
		return *pLeft < *pRight;    
	} 
};

void TestPriorityQueue()
{
priority_queue<Date, vector<Date>, Less> q;
q.push(&Date(2019, 8, 14));
q.push(&Date(2019, 8, 15));
q.push(&Date(2019, 8, 16));
cout << *q.top() << endl;
return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

为什么将stack、queue和priority_queue称作为容器适配器?

  • 虽然stack、queue、priority_queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将 其称为容器适配器,这是因为每个容器在底层都有自己的实现方式,而stack、queue、priority_queue只是 在底层将其他容器进行了封装。

什么是适配器?

  • 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该中模式是将一个类的接口转换成客户希望的另外一个接口。

priority_queue的模拟实现

template<class T,class Sequence=vector<T>,class Compare=less<T>>
class priority_queue
{
public:
	priority_queue()
		:_seq()
	{}
	template<class InputIt>
	priority_queue(InputIt start, InputIt last)
		:_seq(start,last)
	{
		int parent = (_seq.size() - 2) >> 1;
		while (parent >= 0)
		{
			makeDown(parent);
			parent--;
		}
	}
	void push(const T& x)
	{
		_seq.push_back(x);
		makeUp(_seq.size() - 1);
	}
	void pop()
	{
		if (empty())
			return;
		swap(_seq.front(),_seq.back());
		_seq.pop_back();
		makeDown(0);
	}
	bool empty()const
	{
		return _seq.empty();
	}
	const T& top()const
	{
		return _seq.front();
	}
	size_t size()const
	{
		return _seq.size();
	}
private:
	void makeUp(int child)
	{
		int parent = (child - 1) >> 1;
		while (child)
		{
			if (_com(_seq[parent], _seq[child]))
			{
				swap(_seq[parent], _seq[child]);
				child = parent;
				parent = (child - 1) >> 1;
			}
			else
				return;
		}
	}
	void makeDown(int parent)
	{
		int child = parent * 2 + 1;
		while (child < _seq.size())
		{
			if (child + 1 < _seq.size() && _com(_seq[child], _seq[child + 1]))
				++child;
			if (_com(_seq[parent], _seq[child]))
			{
				swap(_seq[parent], _seq[child]);
				parent = child;
				child = parent * 2 + 1;
			}
			else
				break;
		}
	}
	Sequence _seq;
	Compare _com;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

为什么选择deque作为stack和queue的底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有 push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和 queue默认选择deque作为其底层容器,主要是因为:

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增长时,deque比vector的效率高;queue中的元素增长时,deque不仅效率高,而且内存使用率高。
智能车竞赛新手必看:单车定向组直线竞速与八字慢速实战技巧 本文为智能车竞赛新手提供单车定向组直线竞速与八字慢速的实战技巧,涵盖赛道分析、动力调校、传感器配置等关键环节。通过真实案例和代码示例,详细讲解如何平衡速度与稳定性,帮助选手避免常见失误,提升比赛成绩。特别针对智能车竞赛中的直线竞速和八字慢速项目,提供从硬件选型到临场策略的全方位指导。 阅读详情

相关推荐

零样本缺陷检测新体验:用AnomalyGPT大模型快速搭建智能质检系统(附Win10适配指南)

本文详细介绍了如何利用AnomalyGPT大模型在Windows 10系统上快速搭建零样本工业缺陷检测系统。通过实战指南,涵盖从环境部署、模型准备到工程化落地的全过程,包括将模型封装为API服务、接入工业相机以及开发可视化监控看板,为制造业智能质检提供了一套高效、低门槛的本地部署解决方案。

weixin_29094775的博客 310

【C++】priority_queue(优先级队列)

1. prioriy_queue介绍 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。 这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 ,一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。 对于优先权相同的元素,可按

Edward_Asia的博客 6340

Agisoft Metashape相机标定笔记

使用Metashape进行自动相机标定是可能的。(可选:使用打印的棋盘格图案,但需保证它是平坦的且单元格是正方形)。相机标定步骤支持全相机标定矩阵的估计,包含非线性的畸变参数。相机模型的细节请参照附录D——相机模型板块。:在通用的工作流程中,相机标定步骤可以跳过。因为Metashape会在图像定向过程中进行相机自标定。但是,如果定向结果不稳定,例如,由于影像之间缺乏连接点,额外进行单独的相机标定步骤也许是有用的。

天桥飞熊的博客 3975

c++的priority_queue各种使用方法

一般如果使用指针的话,就需要使用函数对象了。template

性感的小君君 6998

法兰克仿真软件FANUC CNC Guide v25.0 安装教程及中文设置

下载地址在文末。我们公司用新到一批FANUC 系统的设备,为方便使用就装了一个 FANUC 数控系统仿真软件FANUC CNC Guide v25.0 ,还是最新版不是市面上流传的老版本。模拟学习一下。

hakesashou的博客 1万+

python 常见算法(1-50题)

常见的算法题

weixin_58470558的博客 1757

【C++】仿函数 -- priority_queue

仿函数的介绍及其使用,priority_queue 的介绍、使用及其模拟实现。

在平淡的日子里寻找存在的价值 1399

kali破解WIFI密码

今天我们来学习一下通过kali和一个好的字典来破解WIFI密码。 声明:此教程仅供学习研究使用,严禁使用此技术进行非法行为 首先我们需要一个具有监听功能的无线网卡(这里我给大家推荐:rt3070) 本章实验通过虚拟机VMware进行: 先通过services.msc来打开VMware USB Arbitration Service 插上监听网卡,连接USB到虚...

#的博客 5810

优先级队列【C++】

priority_queue的模拟实现、仿函数

qq_2972806103的博客 1148

MATLAB应用实战系列(四十三)-基于MATLAB的光伏并网系统仿真设计

在Matlab中建立光伏电站接入系统模型,包括光伏发电逆变器及负荷模型等,仿真分析接入点处的电能质量,实现高品质并网运行。 壹 构建太阳能电池模型。 初始化参数如下图所示。 贰 构建MPPT控制模型。 具体封装如下所示: 通过PWM算法实现DC-DC稳步输出最大点。 叁 三、构建直流短距离输电线路。 仿真模型如下图: 通过电容来均衡线路电压,使得线路电压保持可靠性。 肆 通过逆变器变换,使得直流线路转换成...

wenyusuran的专栏 3169

第四章节 Qt字符串QString详解

QString 的使用方式和 C++标准库的 std::string 字符串的非常相似。

m0_65635427的博客 890

C++之STL的priority_queue容器

它是一个优先队列,是一个基于优先级堆的容器适配器,底层容器默认使用vector,将vector封装成堆管理元素。默认是使用最大堆。priority_queue是有三个模版参数的1、第一个是class T:表示队列中元素的类型2、第二个是class Container = std::vector:表示底层容器的类型,从中就可以看到,默认是使用std::vector容器。

m0_47428520的博客 500

R语言数据可视化:绘制世界地图的两种方案

本文介绍了两种使用R语言绘制世界地图的方案:包含边界边框和不包含边界边框。无论您选择哪种方案,使用ggplot2包和相关的地理数据包,我们可以轻松地绘制出漂亮的世界地图。R语言提供了丰富的包和函数,使我们能够轻松地绘制世界地图,并根据需求添加边界边框。在本文中,我将介绍两种绘制世界地图的方案:一种包含边界边框,一种不包含边界边框。在上述代码中,我们使用了与方案一相同的数据准备和地图绘制步骤,但省略了添加边界边框的代码。函数的调用,我们可以绘制不包含边界边框的世界地图。方案二:绘制不包含边界边框的世界地图。

CodeMaven的博客 2225

【C++自学笔记】STL—详细理解stcak和queue、priority_queue 及 其模拟实现(容器适配器)

一、stack的介绍和使用 1、stack的介绍 1、stack是一种容器适配器,专门用于具有LIFO(后进先出)的上下问环境中,其删除只能从容器的一端进行,元素的插入和提取操作; 2、stack时作为容器适配器被动实现的,容器适配器即使对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(栈顶)被压入或者弹出; 3、stack的底层...

C/C++菜鸟养成记 680

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

容器适配器stack,queue和priority_queue

一.什么是容器适配器 容器适配器是一个封装了序列容器的一个类模板,它在一般的序列容器的基础上提供了一些不同的功能。之所以称为容器适配器,是因为它是适配容器来提供其它不一样的功能。通过对应的容器和成员函数来实现我们需要的功能。 下面介绍了三个容器适配器:statk<T>,queue<T>,priority_queue<T>。 注意:容器适配器都不存在迭代器。 二.stack栈 2.1 stack的介绍 stac...

weixin_57023347的博客 2310

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STL设计之容器适配器,加之经典题目解析

STL设计之queue,stack,priority_queue

小杰312的博客 3092

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C++】适配器stack/queue/priority_queue使用和实现

stack/queue/priority_queue的使用和实现

2301_81577798的博客 1万+

C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)

queue模拟实现、什么是priority_queue、priority_queue的使用、priority_queue构造函数、模板参数 Compare、什么是仿函数?priority_queue的模拟实现

立志做一个高产且细节博主 657

C++ STL——Queue容器、priority_queue

一、queue 1、基本概念 Queue是一种容器适配器 C++ 标准库定义了三种类型的容器适配器:stack、queue 和 priority_queue。 每种适配器都限制了一些基础容器类的功能,以便对标准数据结构提供精确控制的接口。 Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。一个模板容器适配器类,它提供功能的限制,限制对一些基本容器类型的前端和后端元素的访问权限。 可以在后端添加或从前端移除元素,并且可以在队列的任何一端检查元素。 和

LiuXF93的博客 416

【C++】栈和队列法使用及实现原理

本篇文章会对C++中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助!

weixin_67596609的博客 1502

容器适配器中stack queue priority_queue的介绍及模拟实现

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成他人希望的另外一个接口。

JuLiJuLi.的博客 861

C++ STL 中的 stack、queue 与 priority_queue:从使用到容器适配器原理

若优先队列存储自定义类型(如Date),需重载operator<(大堆)或operator>public:// 重载<:用于大堆(按日期升序,旧日期优先级低)// 重载>:用于小堆(按日期降序,新日期优先级低)// 友元函数:支持cout输出return os;private:// 测试:大堆与小堆// 大堆(默认,按日期降序,最新日期优先级最高)cout << "大堆顶(最新日期):" << pq1.top() << endl;// 小堆(按日期升序,最旧日期优先级最高)

cpparf的博客 1055

深入篇【C++】【容器适配器】:(stack)&&(queue)&&(priority_queue)模拟实现(详细剖析底层实现原理)

深入篇【C++】【容器适配器】:(stack)&&(queue)&&(priority_queue)模拟实现(详细剖析底层实现原理),理解底层架构,能够帮助你更好的使用以及开发,学不在多,而在精。

Extreme_wei的博客 743

STL——理解priority_queue

理解priority_queue的概念和底层实现原理,并且模拟实现

冯同学的博客 960

c++的学习之路:17、stack、queue与priority_queue

本文主要是介绍一下stack、queue、priority_queue的使用以及模拟实现,文章末附上代码以及思维导图。目录摘要一、stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现二、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现三、priority_queue的介绍和使用1、priority_queue的介绍2、priority_queue的使用3、priority_queue的模拟实现四、代码1、stack2、queue。

weixin_64257568的博客 1148

C++ —— 容器适配器和仿函数

在已有的容器(vector、list)的基础上适配出其他的容器。就类似于手机、笔记本电脑的电源适配器,我们已有220V的家庭电源要适配出5V或其他电压的充电器。常用的容器适配器有stack(栈)、queue(队列)、priority_queue(优先级队列)以及反向迭代器。deque是一种容器,它的中文名为双端队列,但是它并不是一个队列。deque是综合了vector的优点和list的优点而集合在一起的,也就是说deque既能够支持随机访问也能够提高头尾、中间插入删除的效率。

weixin_59913110的博客 637
下一篇: 深蓝学院移动机器人路径规划笔记-图搜索
杂质想当杂志
博客等级 码龄10年 13粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值