STL-queue容器适配器

news2024/9/23 15:31:22

目录

一、queue

1.1 使用

1.2 模拟实现

二、priority_queue

2.1 使用

2.2 仿函数

2.2.1 概念

2.2.2 使用 

2.3 模拟实现


一、queue

1.1 使用

具体解释详见官方文档:queue - C++ Reference (cplusplus.com)

queue就是数据结构中的队列:数据结构之队列-CSDN博客

构造函数:

  • queue<T> que; //queue采用模板类实现,queue对象的默认构造形式
  • queue(const queue &que); //拷贝构造函数

赋值操作:

  • queue& operator=(const queue &que); //重载等号操作符

数据存取:

  • push(elem); //尾插
  • pop(); //头删
  • back(); //返回最后一个元素
  • front(); //返回第一个元素

大小操作:

  • empty(); //判断队列是否为空
  • size(); //返回队列的大小

1.2 模拟实现

模拟实现采用适配list的方式实现

由类与对象的相关知识可知,自定义类型的对象会默认调用自定义类型的构造函数,list容器已经有构造函数,所以queue没有必要写构造函数

namespace paradiso
{
	template<typename T, class Container = list<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		const T& front() const
		{
			return _con.front();
		}
		const T& back() const
		{
			return _con.back();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

二、priority_queue

2.1 使用

具体解释详见官方文档:priority_queue - C++ Reference (cplusplus.com) 

priority_queue就是数据结构中的堆:二叉树的顺序实现-堆-CSDN博客

模板中默认的比较函数缺省值为小于,也就意味着默认priority_queue默认建的是大堆,建小堆需要利用仿函数相关的知识。具体看下文讲解。

  • empty():检测容器是否为空
  • size():返回容器中有效元素个数
  • front():返回容器中第一个元素的引用
  • push_back():在容器尾部插入元素
  • pop_back():删除容器尾部元素

2.2 仿函数

2.2.1 概念

在C++中,仿函数(也称为函数对象或函数仿真器,Functor)是一个行为类似函数的对象。仿函数是一种重载了operator()运算符,使得该类的对象可以像普通函数一样被调用。这种技术广泛用于STL(标准模板库)中,例如在算法和容器中。

比起C语言中的函数指针(qsort的使用),C++使用仿函数更简洁易懂。

//仿函数
template<class T>
class Less
{
public:
	//重载函数调用()操作符
	bool operator()(const T& x, const T& y)
	{
		return x < y;
	}
};
template<class T>
class Greater
{
public:
	//重载函数调用()操作符
	bool operator()(const T& x, const T& y)
	{
		return x > y;
	}
};

2.2.2 使用 

template<class T>
class Less
{
public:
	bool operator()(const T& x, const T& y)
	{
		return x < y;
	}
};
int main()
{
	//函数传对象
    Less<int> l;
    //直接传参
	cout << l(1, 2) << endl;
	//本质上是调用了类里面的成员函数
    cout << l.operator()(1, 2) << endl;
	//类模板传类型
    ......
    return 0;
}

2.3 模拟实现

与堆有关的代码请移步:二叉树的顺序实现-堆-CSDN博客

由类与对象的相关知识可知,自定义类型的对象会默认调用自定义类型的构造函数,vector容器已经有构造函数,所以priority_queue没有必要写构造函数

namespace paradiso
{
	// 默认是大堆
	template<class T, class Container = vector<T>, class Compare = Less<T>>
	class priority_queue
	{
	public:
		//向上调整算法
        void AdjustUp(int child)
		{
			Compare com;
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[parent] < _con[child])
				if (com(_con[parent], _con[child]))
				{
					std::swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

		void push(const T& x)
		{
			_con.push_back(x);

			AdjustUp(_con.size() - 1);
		}
        //向下调整算法
		void AdjustDown(int parent)
		{
			// 先假设左孩子小
			size_t child = parent * 2 + 1;

			Compare com;
			while (child < _con.size())  // child >= n说明孩子不存在,调整到叶子了
			{
				// 找出小的那个孩子
				//if (child + 1 < _con.size() && _con[child] < _con[child + 1])
				if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))
				{
					++child;
				}

				//if (_con[parent] < _con[child])
				if (com(_con[parent], _con[child]))
				{
					std::swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}

		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			AdjustDown(0);
		}

		const T& top()
		{
			return _con[0];
		}

		size_t size() const
		{
			return _con.size();
		}

		bool empty() const
		{
			return _con.empty();
		}

	private:
		Container _con;
	};
}

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

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

相关文章

体系结构论文导读(三十四):Design of Reliable DNN Accelerator with Un-reliable ReRAM

文章核心 这篇文章主要讨论了一种在不可靠的ReRAM&#xff08;阻变存储器&#xff09;设备上设计可靠的深度神经网络&#xff08;DNN&#xff09;加速器的方法。文章提出了两种关键技术来解决ReRAM固有的不可靠性问题&#xff1a;动态定点&#xff08;DFP&#xff09;数据表示…

日撸Java三百行(day14:栈)

目录 一、栈的基本知识 1.栈的概念 2.栈的功能 3.栈的实现 二、栈的代码实现 1.栈的基本属性与方法 2.栈的遍历 3.入栈实现 4.出栈实现 5.数据测试 6.完整的程序代码 总结 一、栈的基本知识 1.栈的概念 根据百度百科&#xff0c;我们知道“栈”是存储货物或供旅客…

小怡分享之Java图书管理系统

前言&#xff1a; &#x1f308;✨前面小怡给大家分享了抽象类和接口&#xff0c;今天小怡给大家分享用Java实现图书管理系统。 1.功能 不同的用户看到的菜单是不一样的&#xff0c;我们分为两个用户身份&#xff0c;管理员和普通用户。 2.知识点 数据类型、变量、数组、方法…

跳妹儿学编程之ScratchJr(12):综合篇-五只小猴子床上跳

博主资深软件架构师&#xff0c;拥有13年大型软件与互联网系统开发、设计和架构经验&#xff0c;曾就职于华为&#xff0c;现任职于国内知名互联网公司。平时在家教咱家“跳妹儿”编程&#xff0c;并将心得和过程记录下来。希望可以帮助更多对编程感兴趣的家庭。 引言 在前面的…

略读ArrayList源码

ArrayList是Java集合框架中的一部分&#xff0c;底层是通过数组实现的&#xff0c;可以动态增长和缩减。 一、首先看成员变量 序列化ID定义。在Java中&#xff0c;如果一个类实现了Serializable接口&#xff0c;那么它的serialVersionUID就非常重要了。serialVersionUID用于确…

Cesium初探-CallbackProperty

在Cesium中&#xff0c;CallbackProperty 是一种非常有用的特性&#xff0c;可以用来动态更新实体的属性&#xff0c;如位置、方向、高度等。CallbackProperty 允许你在指定的时间点计算属性值&#xff0c;这样就可以实时地改变实体的状态而不需要频繁地重新设置整个属性。 下…

PCIe学习笔记(16)

层次结构&#xff08;Hierarchy&#xff09;ID Message &#xff08;PCIe I/O 互连的树形拓扑结构称为 PCIe 的 Hierarchy&#xff0c;或称层级、层次&#xff08;不是事务层、数据链路层的“层”&#xff09;。层次区域是指与 RC 某一 RP 相关联的所有设备和链路组成的线路结…

【Linux课程学习】:对于权限的理解(粘滞位)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 这篇文章主要理解权限的概念&#xff0c;以及如何更改…

CSS:图片间空白间距问题的解决方案

一、问题描述 今天有小伙伴遇到多张图片排版显示时中间存在空白间隙&#xff0c;问如何处理&#xff1a; <div> <img width"100%" src"https:/xxx.png" id"1747098" style"max-width:100%;"><img width"100%&qu…

学习进行到了第十七天(2024.8.5)

1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以…

【leetcode详解】另一棵树的子树 (C++递归:思路精析 过程反思)

思路详解&#xff1a; 总体框架&#xff1a; 对root树进行先序遍历&#xff0c;如果当前结点&#xff08;记为cur&#xff09;的值和subRoot的根节点值相等时&#xff0c;就开始判断 以cur为根节点的树 和 子树 是否结构一样? 如何判断两棵树是否结构完全相同&#xff1f; …

Docker Remote API未授权访问漏洞

9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制&#xff0c;如设置iptables…

人工智能时代程序员生存法则

随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作&#xff0c;也有人认为AI是提高效率的得力助手。面对这一趋势,…

什么是亚马逊测评?亚马逊测评的技术要求有哪些?

今天将深入探讨亚马逊测评&#xff0c;这一备受关注的轻资产创业项目&#xff0c;吸引了众多创业者的目光。为了帮助大家更好地理解亚马逊测评&#xff0c;将回答一些常见问题&#xff0c;并分享相关知识。 什么是亚马逊测评&#xff1f; 亚马逊测评是为亚马逊商家提供的一项…

2011-2023各省数字普惠金融指数数据(覆盖广度、使用深度和数字化程度)

2011-2023各省数字普惠金融指数数据 1、时间&#xff1a;2011-2023年 2、指标&#xff1a;数字金融普惠指数、数字金融覆盖广度指数、数字金融使用深度指数、普惠金融数字化程度指数、数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数 3、范…

【MATLAB源码-第242期】基于matlab的OFDM+QPSK系统莱斯信道Ricain信道估计仿真采用LS方法,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;是一种广泛应用于现代通信系统的多载波传输技术&#xff0c;其主要优点包括高频谱效率、抗多径衰落和抵抗频率选择性衰落。OFDM系统通过将高速数据流分割成多个低速数据流&#xff…

javascript:检测图片的宽高

1 方案描述 JavaScript提供了非常方便的FileReader和Image对象&#xff0c;可以帮助我们轻松实现这个功能。具体步骤如下&#xff1a; 获取文件输入框&#xff1a;首先&#xff0c;我们需要获取到用户选择的文件。读取文件内容&#xff1a;然后&#xff0c;通过FileReader对象…

Servlet概念理解和具体实现

目录 1、C/S架构和B/S架构 &#xff08;1&#xff09;C/S架构 &#xff08;2&#xff09;B/S架构 &#xff08;3&#xff09;B/S架构的技术原理 &#xff08;4&#xff09;CS/BS区别 &#xff08;5&#xff09;B/S技术的工作原理 &#xff08;6&#xff09;什么是URL …

华杉研发九学习日记24 线程同步 死锁 线程通信 线程池 Callable接口

华杉研发九学习日记24 java多线程 一&#xff0c;线程同步 1.1 线程同步问题 多个线程同时操作一个全局数据或静态数据时可能会造成数据冲突 解决&#xff1a; synchronized同步代码块synchronized同步方法使用锁对象加锁解锁 // 火车站卖车票 -- 100张 public class…

Django ASGI服务

1. ASGI简介 在Django中, ASGI(Asynchronous Server Gateway Interface)的引入使得Django应用能够支持异步编程. 从Django 3.0开始, Django就增加了对ASGI的支持, 但直到Django 3.1才正式推荐在生产环境中使用ASGI. ASGI是一个用于Python的异步Web服务器的标准接口, 它允许你运…