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,一经查实,立即删除!

相关文章

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

系统架构设计师 - 计算机组成与体系结构(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传入一…

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

无人机与三角翼的结合&#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…

es关闭开启除了系统索引以外的所有索引

1、es 开启 “删除或关闭时索引名称支持通配符” 功能 2、kibanan平台执行 POST *,-.*/_close 关闭索引POST *,-.*/_open 打开索引3、其他命令 DELETE index_* // 按通配符删除以index_开头的索引 DELETE _all // 删除全部索引 DELETE *,-.* 删除全…

鸿蒙OpenHarmony开发板解析:【系统能力配置规则】

如何按需配置部件的系统能力 SysCap&#xff08;SystemCapability&#xff0c;系统能力&#xff09;是部件向开发者提供的接口的集合。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 部件配置系统…

Java入门——类和对象(上)

经读者反映与笔者考虑&#xff0c;近期以及往后内容更新将主要以java为主&#xff0c;望读者周知、见谅。 类与对象是什么&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对…

DDOS攻击实战演示,一次DDOS的成本有多低?

DDoS攻击成本概览 分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其低廉的启动成本和惊人的破坏力著称。攻击者通过黑市轻松获取服务&#xff0c;成本从几十元人民币的小额支出到针对大型目标的数千乃至数万元不等。为了具体理解这一成本结构&#xff0c;我们将通过一个简…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

机器学习-12-sklearn案例03-flask对外提供服务

整体思路 训练一个模型&#xff0c;把模型保存 写一个基于flask的web服务&#xff0c;在web运行时加载模型&#xff0c;并在对应的接口调用模型进行预测并返回 使用curl进行测试&#xff0c;测试通过 再创建一个html页面&#xff0c;接受参数输入&#xff0c;并返回。 目录结…

CSS悬浮动画

<button class"btn">悬浮动画</button>.btn {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);padding: 10px 20px;width: 200px;height: 50px;background-color: transparent;border-radius: 5px;border: 2px solid powderblu…