当前位置: 首页 > news >正文

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用

#include<iostream>
#include<queue>
using namespace std;int main()
{priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << " ";st.pop();}
}

在这里插入图片描述


优先级队列的实现

优先级队列本质上是一个堆,所以实现和堆差不多,不同的是作为优先级队列我们可以使用别的容器来当适配器,比如说我们用vector作为优先级队列的容器,也可以用dequeue(双端队列)来做优先级队列的容器,
本篇我们使用vector来作为优先级队列的容器
所以我们优先级队列的函数可以用vector的函数来封装

#pragma once
#include<iostream>
#include<vector>
#include<functional>
using namespace std;
namespace bit{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;}};
template <class T, class Container = vector<T>, class Compare = less<T> >class priority_queue{public:priority_queue()=default;template <class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){push(*first);first++;}}void adjust_up(int child){int parent = (child - 1) / 2;while (child > 0){if (comp(c[child],c[parent])){swap(c[child],c[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void adjust_down(int parent){int child = parent * 2 + 1;while (child<c.size()){if (child + 1 < c.size() && comp(c[child + 1], c[child])){child = child + 1;}if (comp(c[child],c[parent])){swap(c[parent],c[child]);parent = child;child = parent * 2 + 1;}else{break;}}}bool empty() const{return c.empty();}size_t size() const{return c.size();}const T& top() const{return c[0];}void push(const T& x){    c.push_back(x);adjust_up(c.size() - 1);}void pop(){  swap(c[0], c[c.size() - 1]);c.pop_back();adjust_down(0);}private:Container c;Compare comp;};};
void test()
{bit::priority_queue<int, vector<int>, less<int>>st;st.push(4);st.push(7);st.push(3);st.push(1);st.push(5);st.push(2);while (!st.empty()){cout << st.top() << " ";st.pop();}}

优先级队列对自定义类型的排序

   class Date{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);}friend ostream& operator<<(ostream& _cout, const Date& d){_cout << d._year << "-" << d._month << "-" << d._day;return _cout;}private:int _year;int _month;int _day;};void test(){priority_queue<Date, vector<Date>, less<Date>>st;Date d1(2024, 4, 9);st.push(d1);st.push({2024,4,11});st.push(Date(2024, 4, 10));while (!st.empty()){cout << st.top() << " ";st.pop();}}

在这里插入图片描述
在这里插入图片描述
如果我们把地址放进优先级队列里面呢??

  void test(){priority_queue<Date*, vector<Date*>, less<Date*>> st;st.push(new Date(2018, 10, 29));st.push(new Date(2018, 10, 30));st.push(new Date(2018, 10, 28));while (!st.empty()){cout << *(st.top()) << endl;st.pop();}}

在这里插入图片描述
在这里插入图片描述
这里为什么排序是无序的呢??
因为它是按照地址的大小来排序的,但是每次new对象,他的地址大小是不确定的,所以排出来属无序的,我们可以实现一个仿函数来实现

   class  Dateless{public:bool operator()(const Date* x, const Date* y){return *x < *y;}};class  Dategreater{public:bool operator()(const Date* x, const Date* y){return *x > *y;}};

在这里插入图片描述


反向迭代器
首先迭代器是怎么将模版适配成所有类型的变量都可以使用??
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


反向迭代器的实现

#pragma onceusing namespace std;
namespace zjw
{     template<class  Iterator,class Ref,class Ptr>struct Reverselterator{typedef Reverselterator<Iterator, Ref, Ptr>Self;Iterator _it;Reverselterator(Iterator it):_it(it){}Ref operator*(){Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return & (operator*());}Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}bool operator!=(const Self& s){return _it != s._it;}};
}

根据反向迭代器的特性,我们知道正向迭代器的++就是反向迭代器的–,正向迭代器的–就是反向迭代器的++,实现下面两个函数

	Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}
	Ref operator*(){Iterator tmp = _it;return *(--tmp);}

这个为什么要先–呢?
在这里插入图片描述
在这里插入图片描述
同时,需要在vector类或者list类中添加反向迭代器记录起始位置和结束位置的函数

  reverse_iterator rbegin(){//return reverse_iterator(end());return iterator(end());}reverse_iterator rend(){// return reverse_iterator(begin());return iterator(begin());}

这样写比较好理解,用正向迭代器的begin()做反向迭代器的rend(),用正向迭代器的end()做反向迭代器的rbegin(),

vector迭代器的重命名

         typedef T* iterator;typedef const T* const_iterator;typedef Reverselterator<iterator,T&,T*> reverse_iterator;typedef Reverselterator<const_iterator,const T&,const T*> const_reverse_iterator;

list迭代器的重命名

        typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&,const T*> const_iterator;typedef Reverselterator<iterator,T&,T*> reverse_iterator;typedef Reverselterator<const_iterator,const T&,const T*> const_reverse_iterator;

不同的是vector迭代器使用的是原生指针,这样写反向迭代器的好处是既可以给list使用,也可以给vector使用
注意反向迭代器的类命名空间必须和vector或list的命名空间一样.

测试vector的反向迭代器
在这里插入图片描述
测试list的反向迭代器
在这里插入图片描述


相关文章:

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用 #include<iostream> #include<queue> using namespace std;int main() {priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << &qu…...

gocron定时任务管理

基于gocron定时任务建设 基础环境配置 golang安装 下载 wget https://dl.google.com/go/go1.21.6.linux-amd64.tar.gz export PATH$PATH:/usr/local/go/bin 下载gocron组件 wget https://github.com/ouqiang/gocron/releases/download/v1.5.3/gocron-v1.5.3-linux-amd64.tar.g…...

JCYZ H3CNE-RS+

JCYZ H3CNE-RS 20240413 20240413 https://www.h3c.com/cn/ 支持–软件下载–其他产品–模拟器官方下载 人才研学中心—技术认证—电子资料 按范围划分&#xff1a;局域网 城域网 广域网 按拓扑结构划分&#xff1a;总线型 环型 星型 树型 全网状 部分网状&#xff08;优缺点&a…...

太阳光光照试验耐久性老化试验使用太阳光模拟器系统

上海科迎法电气科技有限公司生产的太阳光模拟器系统主要应用于太阳能研究、材料研究、光伏组件测试、空间环境模拟器、植物生长研究、光热模拟等领域&#xff0c;主要表现特征为&#xff1a; 1. 太阳能研究&#xff1a;可用于模拟不同光照条件下太阳能电池的性能测试和研究&am…...

Centos 7.9.2009 下 Gitlab 完全卸载

一、linux版本&#xff1a;lsb_release -a 二、GtiLab 版本 # 查看gitlab的版本号 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 三、开始卸载 3.1&#xff0c;停止Gitlab 相关服务 # 停止所有GitLab相关服务&#xff1a; sudo gitlab-ctl stop# 移除GitLab包…...

Navicat Premium 16 for Mac/Win:数据库管理的全能之选

在数字化时代&#xff0c;数据库管理已成为各行各业不可或缺的一环。而Navicat Premium 16作为一款功能强大的数据库管理软件&#xff0c;无疑为数据库管理员和开发者提供了高效、便捷的解决方案。 Navicat Premium 16支持多种主流数据库系统&#xff0c;无论是MySQL、Postgre…...

使用腾讯云服务器如何搭建网站?新手建站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程&#xff0c;…...

抖音快手直播整蛊软件插件工具合集(多啦咪/梦歌)

哪一款整蛊直播软件靠谱呢&#xff1f; 相信很多粉丝宝宝们&#xff0c;在做抖音直播或者快手的都在找好用又便宜的直播整蛊插件或者软件&#xff0c;但是好用的几乎少之又少&#xff0c;今天梦歌给大家分享几个&#xff0c;目前在用的也亲测过的几个软件及插件工具给大家参考&…...

探究C++20协程(2)——取值、传值、销毁与序列生成器实现

序列生成器是一个非常经典的协程应用场景,尤其是在需要惰性生成数据或处理潜在无限的数据流时。 序列生成器概念&#xff1a;序列生成器允许程序按需生成序列中的下一个元素&#xff0c;而不是一次性计算整个序列。这种方式可以节省内存&#xff0c;并允许处理无限或未知长度的…...

【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】

一、token验证过程 用户登录&#xff1a;用户提供用户名和密码进行登录。服务器验证&#xff1a;服务器接收到用户提供的用户名和密码&#xff0c;进行验证。生成token&#xff1a;如果用户名和密码验证通过&#xff0c;服务器会生成一个token&#xff0c;通常包含一些加密的信…...

机器人瓶胚检测工作站(H3U脉冲轴控制)

1、变量定义 2、程序监控1 2、 程序监控2 3、程序监控3 机器人输送料和机构的动作安全尤为重要&#xff0c;下面我们讨论下安全联锁控制逻辑 4、相机拍照触发信号 5、相机拍照触发时序...

数字货币:未来金融的崭新篇章

一、数字货币是什么&#xff1f; 数字货币是一种基于区块链技术的货币&#xff0c;它通过去中心化的方式发行和交易&#xff0c;无需传统的金融机构参与。数字货币的交易过程公开透明&#xff0c;可以确保交易的真实性和不可篡改性。比特币、以太坊、瑞波币等是目前比较知名的…...

USACO18DEC部分题 补题报告

一、Convention S P5119 [USACO18DEC] Convention S 题意 给定大巴的数量&#xff0c;容量&#xff0c;奶牛的数量和到来的时间&#xff0c;要求合理安排大巴的发车时间使奶牛的等待时间最小&#xff0c;求出奶牛最大等待时间的最小值 思路 本题使用二分&#xff0c;输入之…...

聊一聊一些关于npm、pnpm、yarn的事

前言 整理了最近的闲聊&#xff0c;话题是前端各个包管理器&#xff0c;如果分享的不对或者有异议的地方&#xff0c;麻烦请及时告诉我~ 耐心看完&#xff0c;也许你会有所收获~ 概述 本文阅读时间&#xff1a;10-15分钟左右&#xff1b; 难度&#xff1a;初级&#xff0c…...

c语言多功能计算软件170

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 要求 主要代码片段 题目 设计一个计算器软件&#xff0c;具备如下功能提示界面。 要求 设计出界面&#xff0c;注意界面名称最后为自己的姓名&#xff1b;&#xff08;20分&#xff09;能够实现加、减、乘、…...

python图形化展示数据:保存为图片后查看

python debug时需要图像化展示数据&#xff0c;有三种方法。 方法一&#xff1a;t是值在[0, 255]之间的numpy数组&#xff0c;形状为 [ x ∗ x ∗ 3 ] [x*x*3] [x∗x∗3]&#xff0c;其中3为channel数。&#xff08;使用t.permute(1,2,0)变换通道&#xff0c;使用np.squeeze(t…...

PostgreSQL入门到实战-第二十四弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(八)官网地址PostgreSQL概述PostgreSQL中CROSS JOIN命令理论PostgreSQL中CROSS JOIN命令实战更新计划 PostgreSQL中表连接操作(八) 使用PostgreSQL CROSS JOIN从连接的表中生成行的笛卡尔乘积。 官网地址 声明: 由于操作系统, 版…...

Spring Boot 统一功能处理(二)

本篇主要介绍Spring Boot统一功能处理中的统一数据返回格式。 目录 一、定义统一的返回类 二、配置统一数据格式 三、测试配置效果 四、统一格式返回的优点 五、源码角度解析String问题 一、定义统一的返回类 在我们的接口在处理请求时&#xff0c;返回的结果可以说是参…...

Flutter开发基础之动画专题

Flutter开发基础之动画专题 动画设计的作用是让UI界面更流畅、直观&#xff0c;能够有效的提升用户体验。 在Flutter开发中&#xff0c;动画分为多个方面&#xff1a; 基础动画、页面交互动画、绘图动画、矩阵变换等。 基本动画 常用的基本动画有透明度动画、缩放动画、旋转动…...

PHP 图片裁剪类封装

PHP工具类 图片裁剪类封装 <?php namespace App\Utils;/*** 图片裁剪工具类* author 田小涛* date 2020年7月23日* comment**/ class ImageCropUtils {private $sImage;private $dImage;private $src_file;private $dst_file;private $src_width;private $src_height;priv…...

Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示

1.概述 在14.0的系统rom产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: 2.S…...

FPGA:图像数字细节增强算法(工程+仿真+实物,可用毕设)

目录 日常唠嗑一、视频效果二、硬件及功能1、硬件选择2、功能3、特点 未完、待续……四、工程设计五、板级验证六、工程获取 日常唠嗑 有2个多月没写文章了&#xff0c;又是老借口&#xff1a;“最近实在是很忙”&#x1f923;&#xff0c;不过说真&#xff0c;确实是比较忙&am…...

Android netty的使用

导入netty依赖 implementation io.netty:netty-all:4.1.107.Final使用netty 关闭netty /*** 关闭*/private void closeSocket() {LogUtils.i(TAG, "closeSocket");if (nettyManager ! null) {nettyManager.close();nettyManager null;}if (nettyExecutor ! null) {…...

苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区

当你一早打开苹果电脑&#xff0c;结果系统突然提示&#xff1a; “启动磁盘已满&#xff0c;需要删除部分文件”。你会怎么办&#xff1f;如果你认为单纯靠清理废纸篓或者删除大型文件就能释放你的启动磁盘上的空间&#xff0c;那就大错特错了。其实苹果启动磁盘的清理技巧有很…...

【Java SE】多态

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 多态1.1 多态是什么1.2 多态的意义1.3 多态的实现条件 2. 重写2.1 重写的概念2.2 重写的规则2.3 重写与重…...

Yarn vs npm的大同小异Yarn是什么?

Yarn vs npm的大同小异&Yarn是什么&#xff1f; 一、Yarn、npm是什么&#xff1f;二、Yarn vs npm&#xff1a;特性差异总结 一、Yarn、npm是什么&#xff1f; npm是Node.js的包管理器&#xff0c;是由Chris Korda维护。 npm,它全称为Node Package Manager&#xff0c;是…...

1.Godot引擎|场景|节点|GDS|介绍

Godot介绍 Godot是一款游戏引擎 可以通过在steam商城免费下载 初学者和编程基础稍差的推荐学习使用GDScript&#xff0c;和python有些相似 Godot节点 Godot的开发思想——围绕节点 节点的特征与优势 最常用基本的开发组件大部分都具有具体的功能&#xff0c;如图片&#xf…...

springboot3 redis 实现分布式锁

分布式锁介绍 分布式锁是一种在分布式系统中用于控制不同节点上的进程或线程对共享资源进行互斥访问的技术机制。 在分布式环境中&#xff0c;多个服务可能同时访问和操作共享资源&#xff0c;如数据库、文件系统等。为了保持数据的一致性和完整性&#xff0c;需要确保在同一…...

2024年第十四届MathorCup数学应用挑战赛A题思路分享(妈妈杯)

A题 移动通信网络中PCI规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少物理层的小区间互相干扰(ICI),增加物理下行控制信道(PDCCH)的吞吐量有着重要的作用,尤其…...

运动听歌哪款耳机靠谱?精选五款热门开放式耳机

随着人们对运动健康的重视&#xff0c;越来越多的运动爱好者开始关注如何在运动中享受音乐。开放式蓝牙耳机凭借其独特的设计&#xff0c;成为了户外运动的理想选择。它不仅让你在运动时能够清晰听到周围环境的声音&#xff0c;保持警觉&#xff0c;还能让你在需要时与他人轻松…...

大连手机自适应网站制作费用/某一网站seo策划方案

springCloud 微服务日志配置 项目日志配置 logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL&#xff0c; 如果设置为WARN&#xff0c;则低…...

用wordpress做视频网站/郑州全域静态管理

sql是声明性语言&#xff1a;首先要把这个概念记在脑中&#xff1a;“声明”。 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例&#xff0c;而不是告诉计算机如何能够得到结果。 SQL 语言声明的是结果集的属性&#xff0c;计算机会根据 SQL 所声明的…...

wordpress 内容 管理/网站策划是做什么的

节点健康检测意义在K8S集群运行的过程中&#xff0c;节点常常会因为运行时组件的问题、内核死锁、资源不足等各种各样的原因不可用。Kubelet默认对节点的PIDPressure、MemoryPressure、DiskPressure等资源状态进行了监控&#xff0c;但是当Kubelet上报这些状态的时候&#xff0…...

我想找个郑州做网站的/免费域名注册

一、源码安装 1、下载nginx源码包 curl -O https://nginx.org/download/nginx-1.12.2.tar.gz 2、安装nginx所需的依赖&#xff1a; zip模块需要 zlib 库 ​ rewrite模块需要 pcre 库 ​ ssl 功能需要openssl库 yum -y install gcc* pcre pcre-devel zlib zlib-devel o…...

asp企业营销型网站建设/杭州网站推广平台

在url地址栏传参数如果我们直接使用汉字可能有朋友会发现接受到的是乱码了或在搜索引擎过去都变乱了&#xff0c;下面我们来看看正确的jsp中页面间传汉字参数转码方法。转码&#xff1a;a.href"./showCont.jsp?tcontent" encodeURI(encodeURI(tcontent));解码&#…...

小程序雀神麻将开挂视频/seo兼职

今天有网友对pf的in out 和后面的 a to b 范迷糊&#xff0c;然后举了个例子让他明白假设防火墙是一个学校的门卫室&#xff0c;它是校门与学校里面的教室必经之路&#xff0c; 一个门通向校门外叫$ext_if&#xff0c;另一个门通向学校的教室 $int_if &#xff0c;把自己想像成…...