尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【窗口】set这类有序容器的使用和自定义

【窗口】set这类有序容器的使用和自定义
📅 发布时间:2026/6/21 10:46:22

这个题目我使用的是使用set的容器思路;

关于set容器:

1.set默认排序是从小到大,并且默认的比较器只支持int,double,string,pair<int,int>,tuple的自动排序;
一般来说,我们使用的较多的都是自定义的结构体:struct;这样的结构体无法直接比较大小,我们需要在结构体中重载"<":

struct xx{int x;bool operator <(const xx&other)const{return x < other.x;}
};set<xx> s;

或者修改Cmp:

struct xx{int x;...
};struct Cmp{bool operator ()(const xx&a,const xx&b)const{return a.x < b.x;//这个是从小到大排列,a小a排前面,如果需要从大到小,那么我们使用a.x > b.x;}
};
set<xx,Cmp> s;

题目中的解法使用了Cmp,自定义比较器的写法:

struct window{int x1,y1,x2,y2,num,prior;
};//x范围【x1,x2】y范围【y1,y2】
struct vertice{int x,y;
};
struct Cmp {bool operator()(const window& a, const window& b) const {return a.prior > b.prior; // 大优先级排前面}
};
set<window,Cmp> windows;

也可以不使用比较器Cmp,直接写:

struct window{int x1,y1,x2,y2,num,prior;bool operator<(const window& other) const {return prior > other.prior;   // 大的优先}
};
set<window> windows;

2.然后就是该容器的元素的修改,set无法直接修改元素,只能通过erase再insert的方法更新;同时注意在使用iter迭代器访问set的时候,erase(it)前我们需要使用nxt保留下一个内容,否则it会访问出错;
p.s:迭代器it访问元素要么使用it->num,要么使用 (it).num;因为优先级低于.;

代码如下:

for(auto it = windows.begin();it != windows.end();){//按照优先级if(isValid(*it,v)){find = true;cout << (*it).num << endl;sum++;window w = *it;auto nxt = next(it);windows.erase(it);it = nxt;w.prior = sum;windows.insert(w);//修改优先级,set不可以直接修改内部元素的内容break;}else{++it;}}

整体代码如下:

#include<iostream>
#include<set>
using namespace std;
int N,M;struct window{int x1,y1,x2,y2,num,prior;bool operator<(const window& other) const {return prior > other.prior;   // 大的优先,绕了一点,小于就是大于,所以,自定义operator<就能实现greater功能}
};//x范围【x1,x2】y范围【y1,y2】
struct vertice{int x,y;
};
set<window> windows;bool isValid(window w,vertice v){return (v.x >=w.x1&&v.x <= w.x2)&&(v.y >=w.y1&&v.y <= w.y2);
}int main(){cin >> N >> M;int sum = 0;for(int i = 0;i < N;i++){sum++;int x1,x2,y1,y2;cin >> x1 >> y1>>x2>>y2;window w = {x1,y1,x2,y2,sum,sum};windows.insert(w);}for(int i = 0;i < M;i++){int x,y;cin >> x >> y;vertice v = {x,y};bool find = false;for(auto it = windows.begin();it != windows.end();){//按照优先级if(isValid(*it,v)){find = true;cout << (*it).num << endl;sum++;window w = *it;auto nxt = next(it);windows.erase(it);it = nxt;w.prior = sum;windows.insert(w);//修改优先级,set不可以直接修改内部元素的内容break;}else{++it;}}if(!find){cout << "IGNORED" <<endl;}}
}

相关新闻

  • 中老年人钙片推荐哪款好?2025年12月十大中老年钙片品牌推荐
  • 在石家庄市老家农村盖房子哪个平台靠谱?河北省石家庄市自建房公司/机构权威测评推荐排行榜
  • 2025年知名的标书制作/成都标书优质服务榜

最新新闻

  • 迪庆藏族自治州黄金首饰回收正规门店推荐,附各区回收网点联系方式 - 千叶啊
  • ChatGPT不是新软件,而是你该重建的对话式工作习惯
  • iFakeLocation:无需越狱的iOS虚拟定位工具,三大平台轻松修改设备位置
  • GPT-5.5五大变现场景:外贸翻译、音乐分轨、养老短信等实操指南
  • 漯河市黄金回收多少钱一克?本地实体门店回收价格对比整理 - 开始就结束
  • MNIST数据集Python加载与预处理实战指南

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号