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

【C++/STL】优先级队列,仿函数和反向迭代器

优先级队列

priority_queue.h

#pragma once
#include <vector>
#include <functional>
//仿函数/函数对象
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;}
};
namespace Q
{template<class T,class Container=vector<T>,class Compare=less<T>>class priority_queue{private:Container _con;void AdjustDown(int parent){Compare com;int child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && com(_con[child],_con[child+1]))//看清楚!!!if条件的后面不能加分号!!!{child++;}if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void AdjustUp(int child){Compare com;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;}}}public:priority_queue(){ }template<class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){_con.push_back(*first);first++;}//for (size_t i = (_con.size() - 1 - 1) / 2; i >= 0; i--)注意!!!size_t 永远大于0!循环无效for (int i = (_con.size() - 1 - 1) / 2; i >= 0; i--){AdjustDown(i);}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}void push(const T& x){_con.push_back(x);AdjustUp(_con.size()-1);//push_back后size已经改变!}const T& top(){return _con[0];}bool empty(){return _con.empty();}size_t size(){return _con.size();}};void test_priority_queue1(){//建小堆priority_queue<int,vector<int>,Greater<int>> pq1;pq1.push(1);pq1.push(2);pq1.push(3);pq1.push(4);pq1.push(5);while (!pq1.empty()){cout << pq1.top() << " ";pq1.pop();}cout << endl;}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);private:int _year;int _month;int _day;};ostream& operator<<(ostream& _cout, const Date& d){_cout << d._year << "-" << d._month << "-" << d._day;return _cout;}//template<class T>struct LessDate{bool operator()(const Date* d1, const Date* d2){return *d1 < *d2;}};//void test_priority_queue2()//{//	//建小堆//	priority_queue<Date, vector<Date>, Greater<Date>> pq2;//	pq2.push(Date(2025,9,6));//	pq2.push(Date(2025, 9, 7));//	pq2.push(Date(2025, 9, 2));//	pq2.push(Date(2025, 9, 3));//	pq2.push(Date(2025, 9, 5));//	while (!pq2.empty())//	{//		cout << pq2.top() << " ";//		pq2.pop();//	}//	cout << endl;//}void test_priority_queue3(){//建小堆priority_queue<Date*, vector<Date*>,LessDate> pq3;pq3.push(new Date(2025, 9, 6));pq3.push(new Date(2025, 9, 7));pq3.push(new Date(2025, 9, 2));pq3.push(new Date(2025, 9, 3));pq3.push(new Date(2025, 9, 5));while (!pq3.empty()){cout << *pq3.top() << " ";pq3.pop();}cout << endl;}
}

仿函数

test.cpp

#include <iostream>
using namespace std;
#include "priority_queue.h"
//#include "priority_queue_standard.h"
int main()
{//bit::test_priority_queue2();//从大到小依次Q::test_priority_queue3();//仿函数/函数对象//这个类对象可以像函数一样使用Less<int> lessfunc;cout << lessfunc(1, 2) << endl;cout << lessfunc.operator()(1, 2) << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

反向迭代器

ReverseIterator.h

#pragma once
namespace W
{template<class Iterator,class Ref,class Ptr>struct ReverseIterator{typedef ReverseIterator<Iterator, Ref, Ptr> Self;Iterator _it;ReverseIterator(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) const{return _it != s._it;}};
http://www.xdnf.cn/news/1481833.html

相关文章:

  • 阿喀琉斯之踵:从神话传说到现代隐喻的致命弱点
  • 【Kubernetes】知识点总结6
  • 2025高教社国赛数学建模竞赛B题完整参考论文(含模型和代码)
  • MQTT 与 Java 框架集成:Spring Boot 实战(二)
  • 自注意力机制解析
  • 我用Claude Code 开发了一个浏览器插件
  • Storybook:多框架兼容的前端组件开发工具,高效解决组件隔离开发与文档管理问题
  • ElasticSearch 基础内容深度解析
  • 网站管理后台
  • cifar10下载太慢,解决使用第三方链接或迅雷下载
  • VSCode下载安装与汉化
  • NAND Flash块擦除与数据状态解析
  • 【视网膜分割】一种基于结构自适应模型的空洞残差网络
  • 基于大数据+python的肾脏疾病风险教育与数据可视化系统源码 基于数据挖掘的肾脏疾病风险分析与决策支持系统(调试、开题、LW、PPT)
  • 芯片ATE测试PAT(Part Average Testing)学习总结-20250916
  • 提示词工程知识积累及分析
  • C++ 并发编程指南 实现无锁队列
  • Sentinel服务治理:服务降级、熔断与线程隔离
  • 新后端漏洞(上)- Weblogic SSRF漏洞
  • 「数据获取」《中国服务业统计与服务业发展(2014)》
  • 详解flink性能优化
  • docker使用nginxWebUI配置
  • OSG工具集
  • Python错误测试与调试——文档测试
  • ElemenetUI之常用小组件
  • Elasticsearch面试精讲 Day 10:搜索建议与自动补全
  • GEE:基于自定义的年度时序数据集进行LandTrendr变化检测
  • Qt UDP通信学习
  • 《sklearn机器学习——模型的持久性》joblib 和 pickle 进行模型保存和加载
  • python的数据结构