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

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

这个题目我使用的是使用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;}}
}
http://www.jsqmd.com/news/54816/

相关文章:

  • 【URP】Unity[内置Shader]简单光照SimpleLit
  • 2025年口碑好的医药冷链国际空运专业技术口碑榜
  • 2025年河北沥青路面摊铺公司权威推荐榜单:河道护坡工程/市政道路大修/停车场路面改造服务商精选
  • 中老年人钙片推荐哪款好?2025年12月十大中老年钙片品牌推荐
  • 2025年口碑好的钐钴永磁器件用户好评厂家排行
  • 廊坊市农村自建房找谁好?河北廊坊市自建房公司/机构深度评测口碑推荐榜
  • 2025年知名的赣州装修公司别墅装修/赣州装修公司别墅设计方案
  • 2025年家电产品外观设计公司推荐排行榜前十强
  • 在石家庄市老家农村盖房子哪个平台靠谱?河北省石家庄市自建房公司/机构权威测评推荐排行榜
  • 2025年评价高的环保咨询技术服务热门推荐榜
  • 2025年知名的标书制作/成都标书优质服务榜
  • 河北石家庄市农村自建房口碑推荐榜,2026年自建房公司权威测评优选
  • 2025年LED户外灯具定做厂家权威推荐榜单:LED洗墙灯/LED地埋灯/LED霓虹灯带源头厂家精选
  • 2025年市面上四川密封件优质厂家推荐榜
  • 2025年优质成都制氢设备厂家推荐及采购指南
  • 完整教程:【机器学习入门】55.[第5章 监督学习算法] 逻辑回归的真正实力:可解释与稳健的基线王者
  • 2025年家电产品外观设计公司排行 top 5:专业选择与经验分享
  • 河北廊坊市农村自建房口碑推荐榜,2026年自建房公司权威测评优选
  • 2025年口碑好的视频会议系统专业测评榜
  • 2025年质量好的文件销毁/保密文件销毁品牌服务排行榜
  • 2025年靠谱的四川种苗基地Top口碑厂家推荐
  • 2025年北京卫生间渗水补漏公司权威推荐榜单:卫生间补漏防水/卫生间防水渗水/卫生间补漏标杆企业精选
  • 用mmcv加载和保存数据,mmcv.load, mmcv.dump
  • 2025年浙江面试培训公司年度排名:雪恒白雪面试技巧、团队协
  • 2025年口碑好的不锈钢二段力铰链/大角度二段力铰链TOP实力厂家推荐榜
  • 深入解析:【即插即用模块】注意力篇 | CVPR 2025 | CASAB:能涨2个点!通道+空间双注意力增强特征,简单结构水论文必看!
  • 2025年土豆去皮毛刷直销厂家权威推荐榜单:防静电毛刷辊/尼龙毛刷/清洗机毛刷源头厂家精选
  • STM32标准库工程转LL库工程软件:SPL2LL_Converter_V1.0.1的启动问题
  • Postman持久化保存/设置断言详解 - 详解
  • 为什么说 y = a₁x₁ + a₂x₂ + b 是线性的?