C++仿函数的介绍以及priority_queue的介绍和模拟实现

【C++】-priority_queue(优先级队列的具体使用和模拟实现)以及仿函数的简单介绍 priority_queue(优先级队列的具体使用和模拟实现)以及仿函数的简单介绍 阅读详情

目录

1.仿函数

1.1仿函数的介绍

1.2自定义类型使用仿函数 

1.3自定义支持比较大小,但是比较的逻辑不是自己想要的逻辑

 2.优先级队列priority_queue

2.1priority_queue的介绍

2.2priority_queue的使用

2.3priority_queue的模拟实现 


1.仿函数

1.1仿函数的介绍

        仿函数的本质是一个类模板,只是这个类重载了operator(),所以当使用一个它的对象时看起来像使用和函数一样,所以被称为仿函数。

        下面通过仿函数的形式来写一个小于和大于的比较:

#include <iostream>
using namepsace std;

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;
	}
};

int main()
{
	Less<int> less_func;
	Greater<int> greater_fun;
	int a = 5;
	int b = 10;
	cout << less_func(a, b) << endl;
	cout << greater_fun(a, b) << endl;

	return 0;
}

1.2自定义类型使用仿函数 

        自定义类型需要使用仿函数进行比较时,需要在自定义类型里面提供<和>等比较运算符的重载。例如对日期类进行比较:

#include <iostream>
using namespace std;

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;
	}
};

class Date
{
	friend ostream& operator<<(ostream& _cout, const Date& d);
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);
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Less<Date> less_func;
	Greater<Date> greater_func;
	Date d1(2024, 9, 10);
	Date d2(2024, 8, 15);
	cout << less_func(d1, d2) << endl;
	cout << greater_func(d1, d2) << endl;
	return 0;
}

 1.3自定义支持比较大小,但是比较的逻辑不是自己想要的逻辑

         这个时候仿函数需要我们自己进行重新,比如想通过比较日期类的指针进行日期的比较时,就需要将仿函数写成下面这个样子:

#include <iostream>
using namespace std;

class DateLess
{
public:
	bool operator()(Date* p1, Date* p2)
	{
		return *p1 < *p2;
	}
};

//日期类参考上一个代码中的日期类

int main()
{

	Date d1(2024, 9, 10);
	Date d2(2024, 8, 15);

	Date* p1 = &d1;
	Date* p2 = &d2;
	DateLess func;

	cout << func(p1, p2) << endl;
	cout << func(p2, p1) << endl;
	return 0;
}

 2.优先级队列priority_queue

2.1priority_queue的介绍

        priority_queue的文档介绍

1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。priority_queue包含在queue这个头文件中。

2.类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。在这里面(堆的介绍)中可以进行对堆的了解。

3.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:

(1)empty():检测容器是否为空。

(2)size():返回容器中有效元素个数。

(3)front():返回容器中第一个元素的引用。

(4)push_back():在容器尾部插入元素。

(5)pop_back():删除容器尾部元素。

4.标准容器vector和deque满足这些需求。默认情况下,如果没有为特定的epriority_queue类实例化指定容器类,则使用vector。

5.需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap(),push_heap()和pop_heap()来自动完成操作。

2.2priority_queue的使用

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

#include <iostream>
#include <vector>
#include <queue>
#include <functional>
using namespace std;

void test_priority_queue()
{
	// 默认情况下,创建的是大堆,其底层按照小于号比较
	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();
	}
}

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

        如果每次访问顶部元素时都访问的是最小元素,则需要建立小堆。使用的时候只需要把上述priority_queue<int> q1 改为 priority_queue<int, vector<int>, greater<int>>即可,默认大堆的情况下,给的仿函数是less<int>。

2.3priority_queue的模拟实现 

         优先级队列的存储结构就是一个堆,里面的向上调整算法(AdjustUp())和向下调整算法(AdjustDown())参考堆的结构和实现。

#pragma once
#include <vector>
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;
	}
};


namespace XiaoC
{
	//默认是大堆,排升序,用小于符号
	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]))
				{
					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)
		{
			// 先假设左孩子小
			int 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]))
				{
					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() const
		{
			return _con[0];
		}

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

		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

C++ - 优先级队列(priority_queue)的介绍和模拟实现 - 反向迭代器的适配器实现 - 仿函数 所谓仿函数,其实它本身不是一个函数,而是一个类,在这个类当中重载了 operator() 这个操作符,那么在外部使用这个类的 operator() 这个成员函数的时候,使用的形式就像是在使用一个函数一样,仿函数(函数对象)这个类的对象可以像函数一样使用。如下就是定义的一个仿函数: 像上述 less 类当中 就定义个一个 operator() 运算符重载函数,在外面使用这个函数的时候如下所示: 由上述例子我们发现,如果不看多定义的 newLess 对象的话,在 流插入当中使用 形式就像是在使用函数 阅读详情

相关推荐

C++优先级队列priority_queue、仿函数

1.优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2.优先级队列类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先级队列中位于顶部的元素)。3.优先级队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部“弹出,其称为优先级队列的顶部。4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作。

m0_62183318的博客 1326

【C++】容器适配器与仿函数

容器适配器与仿函数

qq_66314292的博客 273

modbus

从机地址 功能码 起始地址高位 起始地址低位 数量高位 数量低位 字节数 0001H高位 0001H低位 0002H高位 0002H低位 CRC高位 CRC低位。每个输入寄存器的长度为2个字节。其中,CDH对应线圈0013H到001AH的内容,01H对应线圈001B到001CH的内容,未使用位用0填充。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。

lunhuicnm的博客 9750

C语言中比较大小的函数模板,关于C++中定义比较函数的三种方法

关于C++中定义比较函数的三种方法C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。以下,小编为大家介绍关于C++中定义比较函数的三种方法,供大家参考借鉴,欢迎浏览!C++编程优与Pascal的原因之一是C++中存在STL(标准模板库)。STL存在很多有用的方法。C++模板库中的许多方法都需要相关参数有序,例如Sort()。显然,如果你想对一...

weixin_32001071的博客 2943

人机协作新纪元:AI会抢走IT人的饭碗吗?

产品经理用自然语言描述需求,AI将其转化为技术规格书(准确率已达89%)

819

用UDP协议在dos命令行里模拟一个聊天程序

/* 需求: 在dos命令行里模拟一个聊天程序 有收数据的部分,和发数据的部分,这两部分需要同时执行。 那就需要用到多线程技术。 一个线程控制收,一个线程控制发。 */ import java.io.*; import java.net.*; class C

s_x_x的记录 1955

C++中的仿函数

端午放假回家,无意间拾起侯捷的>,之前一直看的不太懂,没想到今天翻到仿函数(factors)一章,竟有所收获,而且刚好与上一章讲述的函数指针很有关联,遂赶紧记录下来。   在algorithm算法库中有一个for_each函数用于对某个可迭代对象进行某种操作,行为类似于python中的map函数。   其核心代码如下: templateclass _InIt, class _Fn1>

cracker_zhou的博客 5590

告别LM2596!用LM5175打造400W自动升降压数控电源(附完整电路图与代码)

本文详细介绍了如何利用LM5175芯片设计400W自动升降压数控电源,替代传统的LM2596方案。通过四开关Buck-Boost拓扑结构,LM5175实现了高达98%的转换效率和400W大功率输出,支持无缝升降压切换。文章涵盖芯片选型、电路设计、PCB布局及STM32数控实现,为工程师提供完整的实践指南。

weixin_27032989的博客 598

10.【C++】容器适配器 stack(栈)、queue(队列)和priority_queue优先级队列(堆) 的使用及模拟实现、仿函数介绍

本文介绍了C++中三种容器适配器(stack、queue、priority_queue)的实现原理和使用方法。stack是后进先出结构,queue是先进先出结构,priority_queue是基于堆的优先级队列。文章详细讲解了它们的接口函数、模拟实现代码,并通过示例演示了具体用法。同时分析了STL选择deque作为默认底层容器的原因。最后还介绍了仿函数在priority_queue中的应用,通过重载operator()实现大小堆的灵活切换。

恢弘志士之气,不宜妄自菲薄 1061

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1196

Codex 100个真实案例 - 用AI自动生成API测试用例(接口测试全覆盖)

API 测试是保障后端质量的关键环节,但手写测试用例既枯燥又容易遗漏。本案例将展示如何用 Codex 从 Swagger/OpenAPI 规范文档自动生成 pytest 测试用例——包括正常流程测试、边界值测试、异常参数测试、性能压力测试,还能自动生成 Mock 数据和精美的 HTML 测试报告。全程自然语言驱动,让 API 测试覆盖率从 0 飙到 90%+!

yueyeguzhuo的专栏 270

【C++】15:priority_queue的理解,使用和模拟实现以及仿函数的介绍和使用

本文详细介绍了C++中的优先级队列(priority_queue)及其实现原理。主要内容包括:1. 优先级队列的基本概念和使用方法,包括构造函数、push/pop操作等;2. 优先级队列的底层实现机制,基于堆数据结构的向上/向下调整算法;3. 仿函数的概念及其在优先级队列中的应用,通过less/greater实现大堆/小堆的灵活切换;4. 特殊场景下的仿函数使用,包括处理自定义类型和指针类型的情况。文章通过大量代码示例演示了优先级队列的各种操作和实现细节,为理解和使用这一重要容器提供了全面指导。

qq_62473190的博客 1073

Agentic-Desktop-Pet:构建本地智能桌面助手的架构与实践

智能体(Agent)作为人工智能领域的重要概念,是指能够感知环境、自主决策并执行任务以实现目标的软件实体。其核心原理在于结合感知、决策与执行模块,通过大语言模型(LLM)等推理引擎处理信息并驱动行动。这种架构的技术价值在于将AI的认知能力与具体的操作系统环境深度融合,从而创造出能主动理解用户上下文、提供个性化服务的智能伙伴。在应用场景上,智能体技术正从云端对话机器人向本地化、场景化的桌面助手演进,旨在解决传统自动化工具缺乏智能、而纯聊天机器人脱离操作环境的问题。本文探讨的Agentic-Desktop-Pe

weixin_27210125的博客 623

C++入门stack和queue适配器介绍+ priority_queue的模拟实现【仿函数基本概念提及】

目录stack介绍 stack介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。 stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作: empty:判空操作 back:获取尾部元素操作 pus.

m0_53421868的博客 642

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【C++】—— priority_queue与仿函数

仿函数呦

yusjushd的博客 2288

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

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

C++:堆排序算法的简单讲解,仿函数的介绍和应用,优先级队列priority_queue的常用接口和模拟实现

本文主要介绍了堆排序算法、仿函数和优先级队列的原理与实现。堆排序通过向上/向下调整算法将数组构建为大堆或小堆,时间复杂度为O(n*logn)。仿函数通过重载operator()实现类似函数的行为,用于模板类和模板函数中。优先级队列基于堆结构实现,支持插入元素和获取最大/最小元素操作,默认使用vector作为底层容器,通过仿函数控制排序方式。文中提供了完整的代码实现,包括堆排序的AdjustUp/AdjustDown算法、仿函数模板类以及优先级队列的push/pop等操作。

2301_81265126的博客 859

Camera2Demo

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【C++初阶】第十二篇—stack和queue(stack和queue的常见接口的用法与介绍+priority_queue+容器适配器+仿函数+模拟实现)

⭐️今天我先为大家介绍STL中的stack和queue容器适配器,它的底层是用其其它容器来实现的,其后我会介绍另一个容器适配器——priority_queue(优先级队列)。 ⭐️博客代码已上传至gitee:https://gitee.com/byte-binxin/cpp-class-code 目录????stack????stack的介绍????stack的接口的介绍????queue????queue的介绍????queue的接口的介绍????容器适配器????deque的简单介绍????stack

weixin_58450087的博客 1528

【C++】queue和priority_queue

队列以及优先级队列

s_little_monster的博客 9615

C++之STL-priority_queue和仿函数的讲解

优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。

JYXCZYH的博客 2269

【C++】stack、queue、priority_queue的模拟实现

2、队长被实现为容器适配器,这些类使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函数来访问其元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。底层是一个堆,在堆后中插入数据,数据就乱了,因此要向上调整堆的数据。

C/C++、数据结构、Linux.... 1244

【C++】stack、queue和priority_queue的模拟实现

之前已经模拟实现了vector和list,在这篇博文中,我们要对stack,queue和priority_queue进行模拟实现。适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。在 C++ 标准库中,容器适配器(Container Adaptors)是一种特殊的容器,它们并非独立的容器类型,而是对现有容器类型进行了封装和适配,以提供特定的接口和行为。

2301_79601095的博客 893

【C++】Stack && Queue && 仿函数

关注一些stack和queue的细节问题,以及了解一下deque(缝合怪)和priority_queue ,并且模拟实现priority_queue。包括:一,Stack && queue 1. 用vector 适配 Stack 2. 用list模拟实现queue 3. 简单认识deque 二,priority_queue 1. 认识优先级队列 2. 仿函数 3. 模拟实现priority_queue

tan_run的博客 1242

【C++笔记】stack、queue以及仿函数

stack的文档queue的文档优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。优先队列类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

跃渊的博客 922

【C++】priority_queue的模拟实现

文章摘要 本文详细解析了C++中priority_queue的实现原理及仿函数的使用。主要内容包括: priority_queue要点:介绍其作为容器适配器的特性,默认使用vector作为底层容器,通过仿函数less/greater控制大/小根堆。 仿函数详解: 定义:通过重载operator()使类对象可像函数一样调用 应用:改造冒泡排序算法,使其支持通过仿函数灵活定义比较规则 priority_queue模拟实现: 基础框架设计(命名空间、模板参数)

2401_86785052的博客 861

【C++】priority_queue使用和模拟实现——仿函数

priority_queue(优先级队列)的使用和模拟实现,初次了解仿函数的概念

weixin_63249832的博客 1621
上一篇: C++ 中 stack 和 queue 的模拟实现 -- 容器适配器,deque 的简单介绍,stack 和 queue 的模拟实现,优先级队列的模拟实现,后缀表达式,基本计算器的模拟实现
下一篇: C++模板进阶 -- 非类型模板参数,模板的特化,全特化,偏特化/半特化,模板的分离编译
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值