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

运行结果如下:

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

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

相关文章

前端开发指导

前端开发指导 本文介绍了配置前端开发环境需要的软件、配置项等,指导如何开始进行UDM部门前端开发的全流程。本文以Windows系统下在Microsoft Virtual Studio Code中开发为基础。 一、综述 目标:零基础或者新员工依照此文档,能够完成开发环境的搭建及熟悉测试环境的搭建。…

apache与nginx下安装zabbix

apache下安装zabbix #进入zabbix官网 https://www.zabbix.com/ #选择好要配置的服务#安装zabbix存储库 [rootzabbix-server ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm [rootzabbix-server ~]# yum clean all #清理…

C语言 | Leetcode C语言题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; int directions[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};bool check(char** board, int boardSize, int boardColSize, int** visited, int i, int j, char* s, int sSize, int k) {if (board[i][j] ! s[k]) {return false;} else if (…

FreeRTOS学习 -- 列表和列表项

列表和列表项是 FreeRTOS 的一个数据结构&#xff0c;FreeRTOS 大量使用到了列表和列表项。 一、什么是列表和列表项 1、列表 列表是 FreeRTOS 中的一个数据结构&#xff0c;被用来跟踪 FreeRTOS 中的任务。与列表相关的全部东西都在文件 list.c 和 list.h中。 List_t 结构体…

【Linux网络编程】I/O多路转接之select

select 1.初识select2.了解select基本概念和接口介绍3.select服务器4.select特点及优缺点总结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603;…

NSSCTF | [SWPUCTF 2021 新生赛]easyrce

这是一道很简单的RCE&#xff08;远程命令执行&#xff09;&#xff0c;打开题目后可以看到一个php脚本。 <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> 直接传入url参数就可以执行相应的命令&#xff0c;先…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第3章 Ubuntu20.04系统设置

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

零售数据分析:哪些商品贡献高?就这样分析

销售额高&#xff0c;不代表毛利率高&#xff0c;所以即便销售额排名前5也不能说它的贡献排名就是前5的。要知道贡献高不高&#xff0c;还得综合各项指标来分析。在下面这张BI零售数据分析报表中&#xff0c;我们根据商品大、中、小类以及商品、门店的维度来综合分析销售贡献&a…

近400所高校,拟新增博士点!

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;社科均可&#xff09; EI • 计算机工程类&#xff08;接收广&#xff0c;录用极快&#xff09; SCI&EI • 4区生物医学类&#xff0c;1.5-2.0&#xff08;录用率99%&#xff09; • 1区工程类&#…

JAVA使用Apache POI动态导出Word文档

文章目录 一、文章背景二、实现步骤2.1 需要的依赖2.2 创建模板2.3 书写java类2.3.1 模板目录2.3.2 Controller类2.3.2 工具类 2.4 测试2.4.1 浏览器请求接口2.4.2 下载word 三、注意事项四、其他导出word实现方式 一、文章背景 基于Freemarker模版动态生成并导出word文档存在弊…

Qt5 互动地图,实现无人机地面站效果

一、概述 本文主要通过Qt5opmapcontrol实现一个简单的无人机地面站效果。opmapcontrol是一个比较古老的QT开源地面站库&#xff0c;可选择谷歌地图&#xff0c;必应地图&#xff0c; 雅虎地图&#xff0c;GIS等。可直接使用源码&#xff0c;也可以编译生成库进行调用。实现效果…

蒸汽工厂的新翼:数字孪生锅炉引领未来

在飞速发展的工业4.0时代&#xff0c;数字孪生技术已经深入到我们生产生活的方方面面。而对于那些承载着重工业血脉的蒸汽工厂来说&#xff0c;一项新的技术正在悄然改变它们的未来。 走进蒸汽工厂&#xff0c;感受传统与现代的交融 蒸汽工厂&#xff0c;这个充满力量与热情的…

让AI触手可及丨2024高通美格智能边缘智能技术进化日隆重举行

5月9日&#xff0c;高通技术公司携手美格智能联合举办了主题为“让智能计算无处不在&#xff0c;2024高通&美格智能边缘智能技术进化日”在深圳隆重举行。大会现场&#xff0c;智能物联网行业合作伙伴齐聚一堂&#xff0c;多位行业资深专家围绕AI与通讯、智能计算、边缘大模…

重学java 35.API 6.包装类

心有所念&#xff0c;必有所灵 —— 24.5.10 一、基本数据类型对应的引用数据类型(包装类) 1概述 就是基本类型所对应的类&#xff08;包装类&#xff09;&#xff0c;我们需要将基本类型转为包装类&#xff0c;从而让基本类型拥有类的特性&#xff08;是基本类型可以使用包装类…

Electron学习笔记(三)

文章目录 相关笔记笔记说明 五、界面1、获取 webContents 实例&#xff08;1&#xff09;通过窗口对象的 webContent 属性获取 webContent 实例&#xff1a;&#xff08;2&#xff09;获取当前激活窗口的 webContents 实例&#xff1a;&#xff08;3&#xff09;在渲染进程中获…

局域网手机端远程控制手机

局域网手机端远程控制手机 随着科技的进步和智能设备的普及&#xff0c;远程控制技术在日常生活与工作中的应用越来越广泛。其中&#xff0c;局域网内的手机端远程控制手机技术&#xff0c;因其便捷性和实用性&#xff0c;受到了众多用户的关注。本文将简要介绍该技术及其应用…

linux开发笔记(buildroot 增加自己的开发板支持文件)

1、该笔记参考了mangopi r3的buildroot。某宝上卖的LC-PI-200S提供的buildroot就是这个。已经上传到我的资源中&#xff0c;可以下载看看。 2、首先在buildroot目录输入make menuconfig打开buildroot配置。 进入build options查看 可以看到第二行就是buildroot配置的保存位置…

机器学习算法 - 逻辑回归

逻辑回归是一种广泛应用于统计学和机器学习领域的回归分析方法&#xff0c;主要用于处理二分类问题。它的目的是找到一个最佳拟合模型来预测一个事件的发生概率。以下是逻辑回归的一些核心要点&#xff1a; 基本概念 输出&#xff1a;逻辑回归模型的输出是一个介于0和1之间的…

一文扫盲(12):公寓/酒店管理系统的功能模块和界面设计

大千UI工场本次带来第12期&#xff1a;酒店管理系统&#xff0c;从系统定义、功能模块、界面构成和设计方向四个方面讲解&#xff0c;大千UI工场愿意持续和大家分享&#xff0c;欢迎关注、点赞、转发。 公寓管理系统是一种用于管理和运营公寓的软件系统。它通过集成各种功能模…

远程服务器监控工具Navicat Monitor全新发布v3.0 - 支持PostgreSQL用户

Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure 和阿里云等云数据库兼容。Nav…