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://www.mzph.cn/pingmian/10023.shtml

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

相关文章

js设计模式--观察者模式

概述 观察者模式用于在对象之间建立 一对多 的依赖关系&#xff0c;当一个对象状态发生变化时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都会收到通知并自动更新。在js中&#xff0c;观察者模式通常由两个角色组成&#xff1a;主体&#xff08;Subject&#x…

uniapp 版本检查更新

总体来说uniapp的跨平台还是很不错的&#xff0c;虽然里面各种坑要去踩&#xff0c;但是踩坑也是开发人员的必修课和成长路。 这不&#xff0c;今天就来研究了一下版本检查更新就踩到坑了。。。先来看看检查更新及下载、安装的实现。 先来看看页面&#xff1a; 从左到右依次为…

推荐3个实用的github开源项目

目录&#xff1a; 1、AI生成高清短视频 2、媒体平台爬虫 3、文本转语音项目

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

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

Spring Boot基础功能指引

文章目录 引言I 处理全局ExceptionII 定时任务III 引入springboot MVC3.1 添加Spring Web依赖3.2 重写SpringBootServletInitializer3.3 WebMvcConfigurer引言 I 处理全局Exception 类上加入注解@ControllerAdvice 定义controller切面方法上加入注解@ExceptionHandler(value =…

C++中的`this`指针详解

目录标题 1. this指针的基础1.1 this指针的定义1.2 this指针的用途 2. this指针的详细用法2.1 区分同名的成员和参数2.2 链式调用2.3 返回对象自身的地址 3. this在特殊情况下的用途3.1 在构造函数中使用this3.2 与智能指针结合使用 4. this指针的限制和注意事项4.1 静态成员函…

vue2 与vue3的差异汇总

Vue 2 与 Vue 3 之间存在多方面的差异&#xff0c;这些差异主要体现在性能、API设计、数据绑定、组件结构、以及生命周期等方面。以下是一些关键差异的汇总&#xff1a; 数据绑定与响应式系统 Vue 2 使用 Object.defineProperty 来实现数据的响应式&#xff0c;这意味着只有预…

系统架构设计师 - 计算机组成与体系结构(1)

计算机组成与体系结构 计算机组成与体系结构计算机结构 ★CPU 组成结构运算器组成控制器组成 计算机体系结构冯诺依曼结构哈弗结构 嵌入式芯片&#xff08;了解&#xff09; 存储系统 ★★★★概述Cache主存编址磁盘管理磁盘基本结构与存取过程磁盘优化分布存储磁盘管理 大家好…

数据挖掘(二)数据预处理

前言 基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 数据挖掘&#xff08;一&#xff09;数据类型与统计 2、数据预处理 2.1数据清理 缺失值处理&#xff1a; from sklearn.impute import SimpleImputer# 创建一个SimpleImputer对象&#xff0c;指定缺失值的处理策略…

Spring框架学习笔记(二):Spring IOC容器配置 Bean,分别基于XML配置bean 和 基于注解配置 bean

1 Spring 配置/管理 bean 介绍 Bean 管理包括两方面 &#xff1a;创建 bean 对象&#xff1b;给 bean 注入属性 Bean 配置方式&#xff1a;基于 xml 文件配置方式&#xff1b;基于注解方式 2 基于 XML 配置 bean 2.1 通过类型来获取 bean 方法&#xff1a;给getBean传入一…

从零开始学习MySQL 事务处理

事务处理与ACID特性 事务是数据库操作的基本单元&#xff0c;它确保一组操作要么全部成功&#xff0c;要么全部失败&#xff0c;以此来维护数据库的一致性。这四个字母缩写ACID代表了事务的四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;**&#xff1a;事务被…

无人机+三角翼:小摩托无人机技术详解

无人机与三角翼的结合&#xff0c;为航空领域带来了一种新型且独特的飞行器——“小摩托”无人机。这种无人机结合了无人机的灵活性和三角翼的飞行稳定性&#xff0c;成为了航空运动领域中的一款热门产品。以下是对“小摩托”无人机技术的详解&#xff1a; 1. 定义与特点&#…

MFC中关于CMutex类的学习

MFC中关于CMutex类的学习 最近在项目中要实现两个线程之间的同步&#xff0c;MFC中提供了4个类&#xff0c;分别是CMutex(互斥量)、CCriticalSection(临界区)、CEvent(事件对象)、CSemaphore(信号量)。有关这4个类的说明&#xff0c;大家可以参考微软官方文档&#xff1a; CM…

七、Redis三种高级数据结构-HyperLogLog

Redis HyperLogLog是用来做基数统计的算法&#xff0c;HyperLogLog在优点是&#xff0c;在输入的元素的数量或者体积非常大时&#xff0c;计算基数占用的空间总是固定的、并且非常小。在Redis里每个HyperLogLog键只需花费12KB内存&#xff0c;就可以计算接近 264 个元素的基数。…

#04 构建您的第一个神经网络:PyTorch入门指南

文章目录 前言理论基础神经网络层的组成前向传播与反向传播 神经网络设计步骤1&#xff1a;准备数据集步骤2&#xff1a;构建模型步骤3&#xff1a;定义损失函数和优化器步骤4&#xff1a;训练模型步骤5&#xff1a;评估模型结论 前言 在过去的几天里&#xff0c;我们深入了解了…

头歌实践教学平台:CG1-v2.0-直线绘制

第1关&#xff1a;直线光栅化-DDA画线算法 一.任务描述 1.本关任务 (1)根据直线DDA算法补全line函数&#xff0c;其中直线斜率0<k<1&#xff1b; (2)当直线方程恰好经过P(x,y)和T(x,y1)的中点M时&#xff0c;统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;模拟代码 &#xff08;3&#xff09;运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中&#xff0c;使用到了com.google.common.collect依赖包&#xff0c;通过这个依赖包中提供的…

Vue踩坑,less与less-loader安装,版本不一致

无脑通过npm i less -D安装less之后&#xff0c;继续无脑通过npm i less-loader -D安装less-loader出现如下错误&#xff1a; 解决方法&#xff1a; 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本&#xff1a; npm i less3.0.4 -D npm i less-loader…

conda删除虚拟环境命令

conda删除虚拟环境命令 删除虚拟环境的命令可以使用conda命令的remove或者env remove子命令&#xff0c;具体的实现方法如下所示&#xff1a; 使用conda remove命令删除虚拟环境&#xff1a; conda remove --name <环境名称> --all 这将删除指定名称的虚拟环境…

Python进阶之-inspect模块详解

✨前言&#xff1a; Python中的inspect模块是用于获取对象的信息的模块&#xff0c;比如查看源代码、列出成员、检查类和函数的参数等&#xff0c;非常适用于调试和反射&#xff08;introspection&#xff09;。接下来&#xff0c;我会详细解释inspect模块&#xff0c;并结合例…