C++初阶之stack,queue,priority_queue的使用和模拟以及仿函数的创建和使用

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    算法

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.stack,queue,priority_queue简介以及代码模拟

1.1 stack

1.2queue

1.3 priority_queue

二.仿函数

2.1priority_queue中的仿函数

2.2sort函数中的仿函数

2.3货物类中的仿函数


一.stack,queue,priority_queue简介以及代码模拟

        在这里我们的stack,queue,priority_queue是适配器,适配器就是不需要我们自己去写,只需要使用我们已有的容器来写,可以使用vector,特可以使用list,但是我们默认使用的是deque,我们看看是如何实现stack,queue,priority_queue这三个的,我们可以直接看代码。这里的大部分内容我在前面写过,可以看博客栈和队列 ,堆。

1.1 stack

template <class T, class Container = deque<T> >
class stack
{
public:
	void push(const T& x)
	{
		_con.push_back(x);
	}

	void pop()
	{
		_con.pop_back();
	}
	size_t size()
	{
		return _con.size();
	}
	bool empty()
	{
		return _con.empty();
	}
	const T& top()
	{
		return _con.back();
	}
private:
	Container _con;
};

1.2queue

template <class T,class Containter=deque<T>>
class queue
{
public:
		
	void push(const T& val)
	{
		_con.push_front(val);
	}
	void pop()
	{
		_con.pop_front();
	}
	size_t size()
	{
		return _con.size();
	}
	bool empty()
	{
		return _con.empty();
	}
	const T& front()
	{
		return _con.front();
	}
	const T& back()
	{
		return _con.back();
	}
private:
	Containter _con;
};

1.3 priority_queue

        priority_queue就是堆,默认为大堆,适配器是vector。

template <class T, class Container = vector<T>,class Comper=less<T>>
class priority_queue
{
public:
	Comper com;
	bool empty()
	{
		return _con.empty();
	}
	size_t size()
	{
		return _con.size();
	}
	const T& top()
	{
		return _con[0];
	}
	void AdJust_up(int n)
	{
		int child = n;
		int parent = (child - 1) / 2;
		while (child > 0)
		{
			if (com(_con[parent] , _con[child]))
			{
				swap(_con[parent], _con[child]);
				child = parent;
				parent = (child - 1) / 2;
			}
			else break;
		}
	}
	void push(const T& val)
	{
		_con.push_back(val);
		AdJust_up(_con.size()-1);
	}
	void AdJust_down()
	{
		int n = _con.size();
		int parent = 0;
		int child = parent * 2 + 1;
		while (child<n)
		{
			if (child + 1 < n &&com( _con[child] ,_con[child + 1])) child++;
			if (com(_con[parent] , _con[child]))
			{
				swap(_con[parent], _con[child]);
				parent = child;
				child = parent * 2 + 1;
			}
			else break;
		}
	}
	void pop()
	{
		swap(_con[_con.size() - 1],_con[0]);
		_con.pop_back();
		AdJust_down();
	}
private:
	Container _con;
};

二.仿函数

2.1priority_queue中的仿函数

        在priority_queue中仿函数就是我们的比较大小时写的,默认为Less<T>,表示大堆,我们可以先看看大堆的仿函数

template <class T>
struct less 
{
	bool operator()(const T& x, const T& y)
	{
		return x < y;
	}
};

我们小堆的仿函数是

template <class T>
struct greater
{
	bool operator()(const T& x, const T& y)
	{
		return x > y;
	}
};

 不管是大堆还是小堆,我们用模板来写,默认传的是大堆,所以我们使用时先实例化一个对象,然后利用operator()来进行比较,也就是com(x,y);如果我们想要传小堆,我们需要把vector传进去,样例如下:

priority_queue<int,vector<int>,greater<int>> q

2.2sort函数中的仿函数

sort默认是升序排序,我们需要传它的迭代器,我们先看样例

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<int> v;
	v.push_back(5);
	v.push_back(4);
	v.push_back(3);
	v.push_back(2);
	v.push_back(1);
	sort(v.begin(), v.end());
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	return 0;
}

运行结果为: 

它的默认的仿函数就是Less<int>,和priority_queuet的一样

sort(v.begin(), v.end(), less<int>());

它的降序就是

sort(v.begin(), v.end(), greater<int>());

2.3货物类中的仿函数

struct Goods
{
	string _name; // 名字
	double _price; // 价格
	int _evaluate; // 评价

	Goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{}
};

我们可以针对名字,价格,评价来进行排序,因此我们需要写关于这三种的仿函数,

struct CmpNameLess
{
	bool operator()(const Goods& x, const Goods& y)
	{
		return x._name< y._name;
	}
};
struct CmpPriceLess
{
	bool operator()(const Goods& x, const Goods& y)
	{
		return x._price  < y._price ;
	}
};
struct CmpEvaluateLess
{
	bool operator()(const Goods& x, const Goods& y)
	{
		return x._evaluate  < y._evaluate ;
	}
};

,我们在传参数时只需要写成匿名对象就可以

int main()
{
	vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,
3 }, { "菠萝", 1.5, 4 } };
	//名字
	sort(v.begin(), v.end(), CmpNameLess());
	vector<Goods>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << it->_name << " " << it->_price << " " << it->_evaluate << endl;;
		it++;
	}
	cout << endl;
	//价格
	sort(v.begin(), v.end(), CmpPriceLess());
	it = v.begin();
	while (it != v.end())
	{
		cout << it->_name << " " << it->_price << " " << it->_evaluate << endl;;
		it++;
	}
	cout << endl;
	//评价
	sort(v.begin(), v.end(), CmpEvaluateLess());
	it = v.begin();
	while (it != v.end())
	{
		cout << it->_name << " " << it->_price << " " << it->_evaluate << endl;;
		it++;
	}
	cout << endl;
}

运行结果如下:

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

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

相关文章

Java | Leetcode Java题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 low;int x matrix[mid / n][m…

激光雷达在工厂散料体积测量中的经济效益分析

随着市场竞争的加剧&#xff0c;企业对于成本控制和效率提升的需求越来越迫切。激光雷达作为一种高效、准确的测量工具&#xff0c;在工厂散料体积测量中发挥着重要作用。本文将对激光雷达在工厂散料体积测量中的经济效益进行分析。 一、减少人工成本 传统的散料体积测量方法…

人工智能_大模型049_模型微调009_llama2模型训练_代码分析和实现_代码记录---人工智能工作笔记0184

以上是项目的整体结构,其中上一节我们看了chatglm3目录下,对chatglm3模型的训练部分的代码,然后 这里的llama2目录下是对llama2模型进行训练的代码. 然后web_demo目录是,对web浏览器中,使用chatglm3,以及llama2.py进行的封装下一节我们再看这个部分 E:\2024\人工智能\fine-tun…

Stable Diffusion写真完整教程

前言 最近自己对AI非常痴迷&#xff0c;并且今后也会一直在这个领域深耕&#xff0c;所以就想着先入门&#xff0c;因此花时间研究了一番&#xff0c;还好&#xff0c;出了点小成果&#xff0c;接下来给大家汇报一下。 AI绘画 提到AI绘画&#xff0c;大家可能立马会想到made…

JMeter 如何应用于 WebSocket 接口测试

WebSocket: 实时双向通信的探索及利用 JMeter 进行应用性能测试 WebSocket 是一项使客户端与服务器之间可以进行双向通信的技术&#xff0c;适用于需要实时数据交换的应用。为了衡量和改进其性能&#xff0c;可以通过工具如 JMeter 进行测试&#xff0c;但需要先对其进行适配以…

光栅测长机高精度检定量规量具

在制造业中&#xff0c;量规、量具等精密测量工具的准确性直接影响着产品质量和制造效率。为了确保这些测量工具的精准度&#xff0c;光栅测长机应运而生&#xff0c;成为了检定量规量具的利器。 光栅测长机是一种高精度的长度测量设备&#xff0c;它是利用光栅的精密刻度和光…

微信小程序之简单的发送弹幕操作

大家看视频的时候是不是时不时会有弹幕飘过~ 在我们微信小程序当中&#xff0c;我们可以十分简单的实现&#xff0c;接下来为大家介绍一下吧&#xff01; 我们使用微信官方给我们的一个视频链接 "http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey302802…

关于docker network网络

首先,我们来看看Docker默认的网络模式,即docker0网桥。 每当你安装Docker时,它会创建一个名为docker0的虚拟网桥,并设置一个IP地址范围供它进行端口映射等工作。所有Docker容器在创建时,都会自动连接到这个docker0网桥,并分配一个虚拟IP地址。这样,容器与主机之间,以及容器与容…

微信小程序开发【Coffee Shopping】(1)

1.环境准备 微信开发者工具&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 前端常用网站集合&#xff1a;http://www.wwp666.cn/ 微信小程序开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/quicksta…

docker部署minio和业务服务因变更minio密码导致访问不到图片的问题

问题起因 业务application和minio都是docker部署。按部署规则minio的环境变量中设置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD。这样就可以用这套用户名密码登录minio了。而我的application中是通过api访问minio获取资源URL&#xff0c;提供给前端的。所以在application的环境变…

Excel实用技巧持续学习

1、Excel高效设置图标格式&#xff1a; 2、饼图可以统一设置数据标签在图外面&#xff01;&#xff01; 环形图不可以&#xff0c;但是可以中间手动加上白色圆形&#xff0c;将饼图变为圆环。 可以设置标签的文本显示&#xff1a; 3、饼图和环形图最好进行排序&#xff01;显得…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…

stable diffusion WebUi本地安装

一、stable diffusion 介绍 Stable Diffusion是一种先进的文本到图像的生成模型&#xff0c;它可以根据给定的文本输入生成高度逼真的图像。 Stable Diffusion模型因其高效性和灵活性&#xff0c;在AI图像生成领域引起了广泛关注&#xff0c;并在实际应用中展示了其强大的能力…

MySQL性能优化:MySQL中的隐式转换造成的索引失效

目录 前言数据准备SQL测试分析和总结 前言 数据库优化是一个任重而道远的任务&#xff0c;想要做优化必须深入理解数据库的各种特性。在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症&#xff0c;这类问题往往还不容易定位&#xff0c;排查费时费力最…

2024年第九届数维杯大学生数学建模挑战赛B 题思路1.0版本

B题&#xff1a;生物质和煤共热解问题的研究 数维杯分享资料&#xff08;问题一代码论文思路&#xff09;链接&#xff08;18点更新&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GSv9dkqcY6G-XUnd0sJe_A 提取码&#xff1a;sxjm 题目分析&#xff1…

基于LLM的自行车道CAD

LLM&#xff08;大型语言模型&#xff09;是强大的工具。对于许多人来说&#xff0c;用语言表达愿望通常比浏览复杂的 GUI 更简单。 1、系统简介和环境搭建 urb-x.ch&#xff0c;这是一家专门从事自行车道建设的公司。轨道采用模块化构建块进行独特设计&#xff0c;可以通过多…

有什么实用的还原试卷的app免费?6个软件教你快速进行还原试卷

有什么实用的还原试卷的app免费&#xff1f;6个软件教你快速进行还原试卷 在现代化的教学环境中&#xff0c;使用数字化工具进行试卷还原变得愈发重要。以下是六个实用的、免费的应用程序&#xff0c;它们为还原试卷提供了便捷的解决方案。 FunAI&#xff1a; 这款应用程序可…

QT作业5

1、聊天室 服务器端 //头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QListWidget> #include <QMessageBox> #include <QDebug> #includ…

软件验收计划书-验收规程(Word原件)

编写软件验收计划是软件开发过程中的一个关键步骤&#xff0c;其重要性体现在以下几个方面&#xff1a; 明确验收标准&#xff1a;软件验收计划详细列出了验收的标准、测试方法、测试环境等&#xff0c;确保所有相关人员对验收的期望和要求有清晰的认识。这有助于避免在验收阶段…

Electron+Vue+pyinstaller服务打包

electron环境安装略 1. electron的入口文件配置test.js, 需要在package.json 配置文件中指定main: src/test.js const { app, BrowserWindow } require(electron)const createWindow () > {const win new BrowserWindow({width: 800,height: 600})// win.loadFile(inde…